web-dev-qa-db-fra.com

Utilisation de xargs avec entrée à partir d'un fichier

Disons que j'ai un fichier avec les éléments suivants

bob
john
sue

Maintenant, ceux-ci correspondent directement (dans ce cas) à un modèle d'URL tel que http://example.com/persons/bob.tar, john.tar, sue.tar.

Je voudrais prendre ces lignes et les exécuter à travers xargs. Je ne sais pas ce qui est passé à la commande en cours d'exécution. Comment puis-je accéder au paramètre à partir de l'invite (disons que je veux simplement faire écho à chaque ligne comme cat file | xargs echo $PARAM) ou à partir d'un script bash.

44
Josh K

Michael's réponse a raison, et devrait régler votre problème. Fonctionnement

cat file | xargs -I % curl http://example.com/persons/%.tar

téléchargera les fichiers bob.tarjohn.tar.sue.tar comme prévu.

[~ # ~] mais [~ # ~] : le chat ici est inutile

utilisez plutôt:

<file xargs -I % curl http://example.com/persons/%.tar
74
Stefan

Je pense que vous demandez comment insérer les lignes individuelles tirées de xargs 'stdin au milieu d'une commande, au lieu de simplement la coller toujours à la fin. Si oui, le -I le drapeau prend un replacement-string argument; xargs remplacera alors replacement-string dans la commande avec la ligne lue depuis stdin:

$ cat file | xargs -I foobar curl http://example.com/foobar.tar
17
Michael Mrozek
 $ man  xargs  
 ... 
 --arg-file = file 
 -a file 
 Lire les éléments du fichier au lieu de l'entrée standard. Si vous utilisez cette option 
, Stdin reste inchangé lorsque les commandes sont exécutées. Autre - 
 Sage, stdin est redirigé à partir de /dev/null.[.____.[ ........____.]

Vous pouvez définir --delimiter=/-d à '\n' ainsi que.


D'un autre côté, si vous essayez simplement de transformer chaque ligne du fichier en URL,

 $  sed  -e's #. * # http: //example.com/persons/&.tar# 'file 

fera l'affaire, et si vous voulez les récupérer tous, canalisez-les dans | wget -i.

9
ephemient

d'une autre manière avec le bouclage Shell:

for i in `cat file`; do curl -I http://foo.com/$i; done

vous pouvez également exécuter chaque itération en arrière-plan en ajoutant & avant le dernier point-virgule - pour les téléchargements très volumineux, cela peut être utile

8
Brad Clawsie

Avec GNU Parallel vous pouvez faire:

cat urls | parallel curl {} ">" {/}

Ou:

cat persons | parallel curl http://example.com/persons/{}.tar ">" {}.tar

Regardez la vidéo d'introduction pour GNU Parallel pour en savoir plus: http://www.youtube.com/watch?v=OpaiGYxkSuQ

3
Ole Tange

while read VAR; do ... done loop est simple mais très polyvalent:

while read Word; do wget http://example.com/persons/$Word; done < file
1
musiphil

Ceci est une version plus générale de la réponse de Stefan: mais j'utilise awk au milieu pour préparer la "chaîne" exacte que j'aimerais que xargs exécute. Et puis xargs utilise bash pour faire le "travail" réel.

C'est un peu exagéré pour cet exemple, mais c'est une solution générale qui, avec quelques modifications, peut résoudre de nombreux problèmes ...

cat file | awk '{print "curl http://example.com/persons/"$1".tar"}' | xargs -0 bash -c
0
Johan