81 votes

xargs avec plusieurs arguments

J'ai une entrée source, input.txt

a.txt
b.txt
c.txt

Je veux introduire ces données dans un programme comme le suivant :

my-program --file=a.txt --file=b.txt --file=c.txt

J'essaie donc d'utiliser xargs mais sans succès.

cat input.txt | xargs -i echo "my-program --file"{}

Il donne

my-program --file=a.txt
my-program --file=b.txt
my-program --file=c.txt

Mais je veux

my-program --file=a.txt --file=b.txt --file=c.txt

Une idée ?

1voto

En fait, c'est relativement facile :

... | sed 's/^/--prefix=/g' | xargs echo | xargs -I PARAMS your_cmd PARAMS

El sed 's/^/--prefix=/g' est optionnel, au cas où vous auriez besoin de préfixer chaque paramètre avec un --prefix=.

El xargs echo transforme la liste de lignes de paramètres (un paramètre par ligne) en une liste de paramètres sur une seule ligne et l'option xargs -I PARAMS your_cmd PARAMS vous permet d'exécuter une commande, en plaçant les paramètres où vous le souhaitez.

Alors cat input.txt | sed 's/^/--file=/g' | xargs echo | xargs -I PARAMS my-program PARAMS fait ce dont vous avez besoin (en supposant que toutes les lignes dans input.txt sont simples et correspondent à une seule valeur de paramètre chacune).

1voto

Steven Points 193

Il existe une autre façon de procéder, si vous ne connaissez pas le nombre de fichiers en amont :

my-program $(find . -name '*.txt' -printf "--file=%p ")

0voto

conny Points 4475

Personne n'a encore mentionné l'écho à partir d'une boucle, je vais donc l'ajouter par souci d'exhaustivité (ce serait ma deuxième approche, la sed étant la première) :

for line in $(< input.txt) ; do echo --file=$line ; done | xargs echo my-program

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X