回答:
さて、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、常にファイル名を印刷するオプションを。