xargs -I replace-strオプションの違い


16

私の理解では、以下はまったく同じ意味です。

ls -1 | xargs file {}
ls -1 | xargs -I{} file {}

-Iオプションが指定されていない場合、デフォルトは-I {}です。

現在のディレクトリ内のすべてのファイルを一覧表示し、fileそれぞれに対してコマンドを実行します。名前にスペースが含まれているものもあります。しかし、違いに気づきました。下記参照:

$ ls -1
Hello World
$ ls -1 | xargs file {}
{}:    ERROR: cannot open `{}' (No such file or directory)
Hello: ERROR: cannot open `Hello' (No such file or directory)
World: ERROR: cannot open `World' (No such file or directory)
$ ls -1 | xargs -I{} file {}
Hello World: directory

-I {}を明示的に指定すると、ファイル名の空白は期待どおりに扱われます。


3
「-Iオプションが指定されていない場合、デフォルトは-I {}」-これは少なくともGNU xargsでは正しくありません。
jjlin

私は自分の間違いを理解しています。xargs fileまたはを指定する必要がありますxargs -I{} file {}。するべきではありませんxargs file {}。-I {}を明示的に指定すると、bashはそれをとして扱いfile "Hello World"ます。-I {}がなければ、として扱われfile Hello Worldます。
foresightyj

1
(1)この議論は、シェル(bash)とはほとんど関係ありません。(2)の-1オプションを知っているのは良いことですが、lsの出力がlsファイルまたはパイプの場合はデフォルトでオンになっているため、ここでは必要ありません。(3)-I非推奨の-i(小文字のI)オプションと混同しています。 -ifooはと同等ですが-Ifoo、plainはと-i同等-I{}です。ただし、を使用します-I{}。(4)自分のやりたいことを本当にやりたいのなら、単に言ってみませんfile *か?
スコット

@Scott私の元々の意図は `findを書くことでした。-name "* .mov" | xargs -I {} file {} `すべてのmovファイルを再帰的に見つけて実行fileします。しかし、私はを使用してより簡単な例を思いつきましたls。あなたが正しいです。そのためにfile *は、最高です。
foresightyj

1
見つけます-exec
クリスチャンシウピトゥ

回答:


20

-I定義されたプレースホルダが必要です。-iオプションが仮定されます{}プレースホルダです。これは、man xargs少なくともCygwinとCentOS で{}の仮定を見つけた場所でした。

どちらのオプションも指定せずに呼び出されたxargsはプレースホルダーを必要とせず、STDINを引数の最後に追加するだけです。

echoサンプルに追加するだけで、xargsの動作を確認できます。

$ ls -1
Hello World/

あなたの間違った例は以下を使用します{}

$ ls -1 | xargs echo file {}
file {} Hello World/

そのため、filecmdは引数{} Hello Worldとエラーを確認します。

{}xargs呼び出しで明示的に使用する場合:

$ ls -1 | xargs -i echo file {}
file Hello World/

またはプレースホルダーなし:

$ ls -1 | xargs echo file
file Hello World/

上記のxargsは{}を必要としません。プレースホルダーなしで、STDINをコマンドの最後に追加します。通常、{}の使用は、次のように、cmdの途中のどこかでSTDINを実行することを意味します。

$ ls -1 | xargs -i mv {} /path/to/someplace/.

それは非常に明確です。あなたの答えは少し遅れていますが、それを読むことで本当に理解が深まります。
foresightyj
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.