xargs -Iオプション


12

xargsのマニュアルは言います:

-I replace-str
--replace [= replace-str]
-i [replace-str]
初期引数のreplace-strを、標準入力から読み取った名前に置き換えます。

私はこの部分を理解していません: with names read from standard input.

たとえば、何が起こっているのか:

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo | wc -l

上記のコードは、ディレクトリ内のファイル/ディレクトリの総数をカウントします。

誰かがこれを私に説明できますか?

回答:


20

「標準入力から名前を読み取る」とは、標準入力からxargs受け取ったデータを受け取り、分割して、そのデータを使用して、引数で指定されたコマンドを実行することを意味します。デフォルトでは、空白または改行で分割さechoれ、できるだけ多くの引数を使用して同時に実行されます。

-0あなたの例のオプションは、xargs空白や改行の代わりにnullバイトで入力を分割するように指示します。組み合わせることfind-print0、これは空白や改行を含むファイル名を適切に処理することができます。

この-Iオプションは、新しいコマンドラインの作成方法を変更します。一度にできるだけ多くの引数を追加する代わりにxargs、入力から一度に1つの名前を取得し、指定されたトークン({}ここ)を探し、それを名前に置き換えます。

あなたの例で{}は、はに与えられたコマンドテンプレートに存在しないxargsので、実際にxargsecho、引数なしで実行するように指示されていますfind。これを見るには、以下をドロップしwcます。

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo

一連の空白行が表示されます...これと比較してください

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0I{} echo {}

そして

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 echo

そして

find . -mindepth 1 -maxdepth 1 -print0 | xargs -0

より良い理解を得るために。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.