Dis que j'ai un fichier avec les éléments suivants
bob
john
sue
Maintenant , ceux - ci directement correpondre (dans ce cas) modèle d'URL tels que http://example.com/persons/bob.tar
, john.tar
, sue.tar
.
Je voudrais prendre ces lignes et les parcourir xargs
. Je ne sais pas ce qui est passé à la commande en cours d'exécution cependant. Comment puis-je accéder au paramètre soit à l'invite (disons que je veux simplement faire écho chaque ligne comme cat file | xargs echo $PARAM
) ou à partir d'un script bash.
xargs
elle la divise par ligne et introduit chaque ligne dans une commande, n'est-ce pas? Comment puis-je accéder à cela si j'ai besoin de dire quelque chose commecat file | xargs curl http://example.com/[PASSED FROM FILE].tar
?Réponses:
La réponse de Michael est juste et devrait régler votre problème. Fonctionnement
téléchargera les fichiers
bob.tar
john.tar.
sue.tar
comme prévu.MAIS : le chat ici est inutile
plutôt utiliser:
la source
cat xaa xab xac xad ... xargs ...
cat
est très bien, je voudrais juste ajouter plus d’informations ... :)xargs -I % curl …
( option xargs avantcurl
et ses options / arguments). À tout le moinsxargs curl -I %
(où-I %
est destiné en tant qu'option à xargs , pas curl ) n'est pas portable.Je pense que vous demandez comment insérer les lignes individuelles extraites de
xargs
'stdin au milieu d'une commande, au lieu de simplement les coller à la fin. Si c'est le cas, le-I
drapeau prend unreplacement-string
argument;xargs
remplacera alorsreplacement-string
dans la commande la ligne lue dans stdin:la source
curl http://example.com/foobar.tar > foobar.tar
?>
est une construction de shell et ne fonctionnera pasxargs
. D'autre part,curl -o
écrira dans un fichier nommé plutôt que sur stdout, comme ce qui sewget
passe, c'est probablement ce que vous voudriez utiliser ici.Vous pouvez définir
--delimiter=
/-d
à'\n'
aussi bien.D'autre part, si vous essayez simplement de transformer chaque ligne du fichier en une URL,
va faire, et si vous voulez aller tous les chercher, il suffit de le diriger dans .
| wget -i
la source
une autre façon de boucler en shell:
vous pouvez également exécuter chaque itération en arrière-plan en ajoutant
&
avant le dernier point-virgule - pour les très gros téléchargements, cela peut être pratiquela source
while IFS= read i ; do curl ... ; done < file
Avec GNU Parallel, vous pouvez faire:
Ou:
Regardez la vidéo d'introduction de GNU Parallel pour en savoir plus: http://www.youtube.com/watch?v=OpaiGYxkSuQ
la source
while read VAR; do ... done
la boucle est simple mais très polyvalente:la source
Ceci est une version plus générale de la réponse de Stefan: s, 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 ...
la source