回答:
さて、stdoutに書き込むコマンドで機能する一般的なケースはuseですxargs
。これにより、コマンドの最後に任意の数のコマンドライン引数を追加できます。
$ find … | xargs grep 'search'
またはgrep
、バッククォートまたはを使用して行にコマンドを埋め込み、コマンド$()
を実行してその出力を置換します。
$ grep 'search' $(find …)
これらのコマンドは、ファイル名に空白または特定の他の「奇妙な文字」(\'"
xargs、\[*?
for $(find …)
)が含まれている場合は機能しないことに注意してください。
ただし、特定のfind
引数でプログラムを実行する機能の特定のケースでは、組み込みです。
$ find … -exec grep 'search' {} \;
間のすべて-exec
とは、;
実行するコマンドです。{}
はで見つかったファイル名に置き換えられますfind
。これgrep
により、ファイルごとに個別に実行されます。以来、grep
多くのファイル名を取得し、それらをすべて検索することができ、あなたが変更することができます;
すること+
に一致するすべてのファイル名を渡すために見つける伝えるためにgrep
、一度に:
$ find … -exec grep 'search' {} \+
find ... -type f -print0 | xargs -r0 grep 'search' /dev/null
。QED。一方で-exec +
非常に効率的である、それは検索のすべてのバージョンに存在しません。
$ find … -exec grep 'search' {} \+
フォームが非常に高速であることがわかりました。
一部のバージョンgrep
(たとえば、非組み込みLinux、BSD、またはMac OS X)には-r
、再帰検索を行うオプションがあります。OpenBSDでは、使用します-R
(--exclude
以下の例のようにありません)。これはとの単純な組み合わせを対象とfind
していgrep
ます。
実装に-R
フラグがない場合、またはより洗練されたファイル一致条件が必要な場合は、-exec
プライマリを使用しfind
て実行することができgrep
ます。いくつかの古いfind
実装はサポートしていません-exec
… +
; これらのシステムでは、;
代わりにを使用します+
(これはgrep
ファイルごとに1回呼び出されますので、遅くなりますが、そうでない場合は結果は同じになります)。1つのファイルでファイル名が呼び出された場合でもファイル名を表示する/dev/null
トリックに注意してくださいgrep
(GNU grepとFreeBSD / NetBSD / OSX grepには-H
同じ効果を達成するオプションがあります)。
find . -type f -name '*.o' -prune -o -exec grep 'needle' /dev/null {} +
grep -r --exclude='*.o' 'needle' .
GNU grep
持って-H
、常にファイル名を印刷するオプションを。