cat/Xargs de commande/VS/bash/commande
la page 38 du livre Linux 101 Hacks suggère:
cat url-list.txt | xargs wget –c
j'ai l'habitude de faire:
for i in `cat url-list.txt`
do
wget -c $i
done
y a-t-il quelque chose, autre que la longueur, où la technique xargs est supérieure à l'ancienne technique good for-loop en bash?
ajouté
le C code source semble n'avoir qu'une fourchette. En revanche, combien de fourches ont le bash-combo? s'il vous plaît, développer sur la question.
7 réponses
De la section "Justification" de UNIX page de manuel de xargs
. (Il est intéressant de noter que cette section n'apparaît pas dans la version BSD D'OS X de xargs
, ni dans la version GNU.)
l'application classique des xargs l'utilité est en conjonction avec le trouver l'utilité pour réduire le nombre de processus lancé par une utilisation simpliste de la combinaison find-exec. Le l'utilitaire xargs est également utilisé pour un limite supérieure de mémoire requise pour le lancement d'un processus. Avec cette base attention, ce volume de POSIX.1-2008 sélectionné seulement les caractéristiques minimales requis.
Dans votre suivi, vous demandez combien de fourches de l'autre version. Jim a déjà répondu à cette : un par itération. Combien d'itérations sont là? Il est impossible de donner un nombre exact, mais il est facile de répondre à la question générale. Combien de lignes sont là, dans votre url de la liste.fichier txt?
il y a d'autres considérations. xargs
nécessite un soin supplémentaire pour les noms de fichiers avec des espaces ou d'autres caractères no-no, et -exec
a une option ( +
), qui regroupe les traitements en lots. Donc, tout le monde ne préfère pas xargs
, et peut-être que ce n'est pas le mieux pour toutes les situations.
voir ces liens:
aussi considérer:
xargs -I'{}' wget -c '{}' < url-list.txt
mais wget fournit un moyen encore mieux pour le même:
wget -c -i url-list.txt
en ce qui concerne la prise en compte des xargs par rapport aux boucles, je préfère xargs lorsque le sens et la mise en œuvre sont relativement" simples "et" clairs", sinon, j'utilise des boucles.
xargs vous permettra également d'avoir une liste énorme, ce qui n'est pas possible avec la version "for" car le shell utilise des lignes de commande de longueur limitée.
xargs
est conçu pour traiter plusieurs entrées pour chaque procédé qu'il fourche. Un script shell avec une boucle for
sur ses entrées doit bifurquer un nouveau processus pour chaque entrée. Le fait d'éviter ces frais généraux par procédé peut donner à une solution xargs
une amélioration significative de la performance.
au lieu de GNU/Parallel, je préfère utiliser xargs dans le traitement en parallèle. Ajouter-P pour indiquer combien de fourches effectuer en parallèle. Comme dans...
seq 1 10 | xargs -n 1 -P 3 echo
utiliserait 3 fourches sur 3 cœurs différents pour le calcul. Ceci est supporté par GNU xargs moderne. Vous devrez vérifier vous-même si vous utilisez BSD ou Solaris.
en Fonction de votre connexion internet, vous pouvez utiliser GNU Parallèle http://www.gnu.org/software/parallel/ exécuter en parallèle.
cat url-list.txt | parallel wget -c
un avantage que je peux penser, c'est que, si vous avez beaucoup de fichiers, cela pourrait être légèrement plus rapide puisque vous n'avez pas autant de frais généraux à partir du démarrage de nouveaux processus.
Je ne suis pas vraiment un expert de bash, donc il pourrait y avoir d'autres raisons pour que ce soit mieux (ou pire).