xargs -I Verhalten

xargs -I Verhalten

Eine Variable varenthält mehrere Argumente, die jeweils durch eine neue Zeile getrennt sind.

echo "$var" | xargs -I % echo ABC %
#Results in:
#ABC One
#ABC Two
#ABC Three

Wenn ich jedoch -Idie %Zeichen weglasse, erhalte ich Folgendes:

echo "$var" | xargs echo ABC
#Results in:
#ABC One Two Three

Ich habe einmal gelesen, dass {} das aktuelle Argument ersetzen würde (wie find), aber das passiert nicht. Was mache ich falsch?

Antwort1

Normalerweise xargswerden so viele Argumente wie möglich in die Befehlszeile eines ausgeführten Befehls eingefügt und so lange wiederholt, bis alle Argumente ausgeführt wurden. Auf diese Weise ist dies eine Lösung für das Problem der Längenbeschränkungen für Befehlszeilen.

Wenn Sie jedoch die -IOption angeben, wird der Befehl für jedes Argument ausgeführt.individuell, einer nach dem anderen. Ich glaube nicht, dass das in der Dokumentation der Linux- xargs -IOption ganz klar ist, aber das ist, was sie meinen.

-I replace-str
       Replace occurrences of replace-str in the initial-arguments with
       names read from standard input.  Also, unquoted  blanks  do  not
       terminate  input  items;  instead  the  separator is the newline
       character.  Implies -x and -L 1.

Antwort2

Wenn Sie GNU Parallel anstelle von xargs verwenden, können Sie steuern, welches Verhalten Sie wünschen:

# 1 line at a time
echo "$var" | parallel echo ABC {}
# Many lines at a time (divided by # cpu)
echo "$var" | parallel -X echo ABC {} 
# Many lines at a time (not divided)
echo "$var" | parallel -Xj1 echo ABC {} 

Die Installation von GNU Parallel dauert buchstäblich 10 Sekunden:

wget pi.dk/3 -qO - | sh -x

Sehen Sie sich die Einführungsvideos an, um mehr zu erfahren:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

verwandte Informationen