27

xargsシェルスクリプトで広く使用されています。通常、これらの使用法を bash using while read -r; do ... doneor while read -ar; do ... doneloops で簡単に作り直すことができます。

while-read ループをxargs優先するのはいつですか?

4

6 に答える 6

31

whileループの問題は、一度に 1 つのアイテムを処理する傾向があることです。多くの場合、それは不要です。これはxargs利点があります。引数をまとめて、1 つのコマンドで多くのアイテムを処理できるようにすることができます。

たとえば、while ループ:

pax> echo '1
2
3 
4
5' | while read -r; do echo $REPLY; done
1
2
3
4
5

および対応するxargs:

pax> echo '1
2
3 
4
5' | xargs echo
1 2 3 4 5

ここでは、行が で 1 つずつ処理され、whileで全体が処理されていることがわかりますxargs。つまり、前者は に相当しecho 1 ; echo 2 ; echo 3 ; echo 4 ; echo 5、後者はecho 1 2 3 4 5(1 つではなく 5 つのプロセス)に相当します。プロセスの作成には時間がかかるため、数千行または数万行を処理する場合、これは本当に違いを生みます。

複数の引数を受け入れることができるコマンドを使用する場合、開始される個々のプロセスの数が減り、処理がはるかに高速になるため、主に有利です。

小さなファイルを処理している場合や、各アイテムで実行するコマンドが複雑な場合 (私は怠惰すぎて に与える別のスクリプトを書くことができませんxargs)、whileバリアントを使用します。

パフォーマンス (大きなファイル) に関心があるxargs場合は、別のスクリプトを作成する必要がある場合でも、を使用します。

于 2010-04-04T10:31:58.820 に答える
6

の実装の中には、複数のジョブを並行して実行できる引数xargsも理解するものがあります。これをループでシミュレートするのは非常に困難です。-P MAX-PROCSxargswhile read

于 2010-04-04T13:00:07.267 に答える
6

GNU Parallel http://www.gnu.org/software/parallel/には、xargs(-m を使用する) ことによる利点と、while-read区切り記号としての改行といくつかの新機能 (出力のグループ化、リモート コンピューターでのジョブの並列実行など) の利点があります。 、およびコンテキスト置換)。

GNU Parallel がインストールされている場合、xargs. そして、私が使用する唯一の状況は、read-while実行するブロックが非常に大きく、1 行に入れることができない場合 (たとえば、if ステートメントなどを含む場合) であり、bash 関数の作成を拒否する場合です。

すべての小さなスクリプトについては、実際には GNU Parallel を使用する方が読みやすいと思います。paxdiablo の例:

echo '1
2
3 
4
5' | parallel -m echo

GNU Parallel を使用した WAV ファイルの MP3 への変換:

find sounddir -type f -name '*.wav' | parallel -j+0 lame {} -o {.}.mp3

GNU Parallel の紹介ビデオをご覧ください: http://www.youtube.com/watch?v=OpaiGYxkSuQ

于 2010-07-08T14:30:54.700 に答える
5

「xargs」にはオプション「-n max-args」があり、これにより、複数の引数のコマンドを一度に呼び出すことができると思います(「grep」、「rm」、およびその他多くのそのようなプログラムに役立ちます)マンページの例を試してください:

cut -d: -f1 < /etc/passwd | sort | xargs -n 5 echo

そして、1行あたり5人のユーザーを「エコー」したことがわかります

PSそして、「xargs」がプログラムであることを忘れないでください(サブシェルのような)。したがって、簡単な方法でシェルスクリプトに情報を取得する方法はありません (「xargs」の出力を読み取り、何らかの方法で解釈して、シェル/環境変数を埋める必要があります)。

于 2010-04-04T10:28:54.467 に答える