xargs -I の動作

xargs -I の動作

変数にはvar複数の引数が含まれており、それぞれが新しい行で分割されています。

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

ただし、-I文字を省略すると%、次のようになります。

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

以前、{} が現在の引数の代わりになる (find のように) と読んだことがありますが、そうはなりません。何が間違っているのでしょうか?

答え1

の通常の動作は、xargs実行するコマンドのコマンド ラインに可能な限り多くの引数を貼り付け、すべて完了するまで繰り返し実行することです。この方法で使用すると、コマンド ラインの長さ制限の問題が解決されます。

しかし、オプションを指定すると-I、各引数に対してコマンドが実行されます個別に一度に 1 つずつ。Linuxxargs -Iオプションのドキュメントではそれが完全に明らかではないと思いますが、それが意味していることです。

-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.

答え2

xargs の代わりに GNU Parallel を使用すると、必要な動作を制御できます。

# 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 {} 

GNU Parallel のインストールには文字通り 10 秒しかかかりません。

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

詳細については、紹介ビデオをご覧ください。https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

関連情報