web-dev-qa-db-ja.com

Linuxで中括弧がある場合とない場合のxargsの違いは何ですか

これの違いは何ですか?

ls | xargs rm

ls | xargs -i{} rm {}

どちらも私のために働いています

19
user19140477031

xargs rmは、すべての引数をスペースで区切ったパラメーターとしてrmを呼び出します。

xargs -i{} rm {}は引数ごとにrm {}を呼び出し、{}は現在の引数に置き換えられます。

a.txtb.txtの2つの引数がある場合、xargs rmはこれを呼び出します

rm a.txt b.txt

しかしxargs -i{} rm {}

rm a.txt
rm b.txt

これは、-iオプションが-L 1オプションを意味するためです。つまり、コマンドrmは毎回1行しか使用しません。そして、ここでは各行に1つの引数しか含まれていません。

これをチェックしてください Ideone link それについてのより多くのアイデアを得るために。

20
Shiplu Mokaddim

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

比較する

ls | xargs echo

そして

ls | xargs -i echo '{}'
3
kmkaplan

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

ls | xargs -iPLACEHOLDER echo PLACEHOLDER

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

2
aag