この違いが何なのか知りたい
ls | xargs rm
ls | xargs -i{} rm {}
どちらも私には効果があります
答え1
xargs rm
rm
すべての引数をスペースで区切られたパラメータとして呼び出します。
xargs -i{} rm {}
rm {}
各引数に対して呼び出され、{}
現在の引数に置き換えられます。
引数が2つとある場合a.txt
、 これを呼び出しますb.txt
xargs 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 {}