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.
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.tar
john.tar.
sue.tar
comme prévu.
[~ # ~] mais [~ # ~] : le chat ici est inutile
utilisez plutôt:
<file xargs -I % curl http://example.com/persons/%.tar
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
$ 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
.
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
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
while read VAR; do ... done
loop est simple mais très polyvalent:
while read Word; do wget http://example.com/persons/$Word; done < file
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