-exec xargsと-print0の使用法は何ですか?


20

これらは、あるコマンドの結果を入力として次のコマンドに渡す一般的な方法だと思います。

これら3つはどのように機能しますか?または、いくつかのウェブサイト/ URLは何ですか?

回答:


25

最初に入力するもの:

man find

man xargs

findデフォルトでは標準出力にコマンドを印刷した結果、ので、-printオプションは通常必要ではないが、-print0スペースや改行を含む名前を正しく解釈することができるように0(NULL)バイトでファイル名を分離します。

この-execオプションは、xargsの代わりに使用できるものです。findコマンドは、検出した項目ごとにコマンドを実行します。

このxargsコマンドは、スペースまたは改行で区切られた文字列を読み取り(通常はfindコマンドからですが、どこからでも取得できます)、各文字列に対してコマンドを実行します。
xargsが-0オプションで実行される場合、NULLで区切られた文字列が出力として期待されます。find ... -print0

xargsの利点は、文字列をグループ化できるため、n回ではなく1回または2回だけコマンドを実行できることです。

したがって、通常の使用では:

find start_directory -name '*.txt' | xargs ls -l 

findはファイル名をリストし、xargsは次のようなコマンドを発行します。

ls -l file1.txt file2.txt file3.txt ... fileN.txt

findコマンドを発行するよりも高速です。

ls -l file1.txt
ls -l file2.txt
ls -l file3.txt
ls -l ...
ls -l fileN.txt

7

おそらくすべてこのPOSIX構文をサポートする現在のfind実装ではxargsは必要ないことに注意してください。

find directory -name '*.txt' -exec ls -l {} + 

これは、xargsバリアントよりも簡単でわずかに高速です。

find directory -name '*.txt' | xargs ls -l 

xargsは、「find -exec」よりもはるかに少ないリソースを使用します
フェリペアルバレス

7
それは逆です。xargsへのパイピングは、-execよりもわずかに多くのリソースを使用します。おそらく「+」ターミネーターを見落とすでしょう。
jlliagre

2

これらのリンクの少なくとも1つが停止しています。関連するコードサンプルも投稿する方が良いでしょう。
user5359531

@ user5359531:デッドリンクが置き換えられました。そして、私はそのような膨大なチュートリアルを再現することはできません。
harrymc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.