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.

4
demandé sur Léo Léopold Hertz 준영 2009-08-15 23:52:12

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:

4
répondu Telemachus 2017-05-23 12:25:50

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.

4
répondu nicerobot 2009-08-15 21:51:37

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.

4
répondu xilun 2009-08-15 23:35:19

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.

4
répondu Jim Lewis 2012-01-18 05:45:04

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.

2
répondu J. M. Becker 2011-06-14 15:03:30

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
1
répondu Ole Tange 2010-06-10 18:15:28

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).

0
répondu Matthew Crumley 2009-08-15 19:54:54