ファイルのリストをgrepに渡す方法


98

使用findしたいファイルのリストを使用して取得しgrepています。そのリストをパイプする方法はgrep

回答:


116

さて、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' {} \+

1
最初の2つの形式は、スペースを含むファイル名では機能しないことに注意してください。
-enzotib

1
私が好むfind ... -type f -print0 | xargs -r0 grep 'search' /dev/null。QED。一方で-exec +非常に効率的である、それは検索のすべてのバージョンに存在しません。
アルケージュ

悲しいことに、私はあなたが3回修正することを確認できません。
アルカバード

3
私が使用することをお勧め-execではなく、よりxargs-execin を使用するとfind、コンテンツをgrepするためのシェルが1つだけ作成されます。を使用する場合xargs、2つのシェルが作成されます。1つはシェル用、もう1つはシェルfindxargsです。

2
実験により、$ find … -exec grep 'search' {} \+フォームが非常に高速であることがわかりました。
-gogoud

9

一部のバージョン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' .

2
GNU grep持って-H、常にファイル名を印刷するオプションを。
エンゾチブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.