Linux で中括弧付きの xargs と中括弧なしの xargs の違いは何ですか?

Linux で中括弧付きの xargs と中括弧なしの xargs の違いは何ですか?

この違いが何なのか知りたい

ls | xargs rm
ls | xargs -i{} rm {}

どちらも私には効果があります

答え1

xargs rmrmすべての引数をスペースで区切られたパラメータとして呼び出します。

xargs -i{} rm {}rm {}各引数に対して呼び出され、{}現在の引数に置き換えられます。

引数が2つとある場合a.txt、 これを呼び出しますb.txtxargs rm

rm a.txt b.txt

しかし、xargs -i{} rm {}電話する

rm a.txt
rm b.txt

-iこれは、オプションが-L 1オプションを暗示し、コマンドが毎回 1 行rmだけを取ることを意味するためです。そして、ここでは各行に 1 つの引数のみが含まれます。1

これをチェックしてIdeone リンクそれについてもっと詳しく知るために。

答え2

-iオプション ( と同等--replace) は、xargs が受け取った入力を保存する一種のプレースホルダーを作成します。2 番目のコマンドでは、プレースホルダーは で{}、find オプションのように機能します-exec。定義されると、xargs はこのプレースホルダーを入力行全体に置き換えます。名前が気に入らない場合は{}、独自の名前を定義できます。

ls | xargs  -iPLACEHOLDER echo PLACEHOLDER

あなたの場合、両方のコマンドは同じ結果を生成します。 2 番目の形式では、オプションを使用してデフォルトの動作を明示的に指定しているだけです-I

答え3

中括弧を使用すると、ファイルごとに 1 つのプロセスが生成されますrm。中括弧を使用しない場合は、xargs各コマンドに可能な限り多くのファイル名が渡されますrm

比較する

ls | xargs echo

そして

ls | xargs -I {} echo {}

関連情報