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

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

find閲覧したいファイルのリストを使用してインポートしていますgrep。そのリストをどのようにパイプしますかgrep

答え1

さて、stdoutに書き込むすべてのコマンドに適用される一般的なケースはを使用することです。xargsこれにより、コマンドの最後に必要な数のコマンドライン引数を追加できます。

$ find … | xargs grep 'search'

バックティックを使用するか、grep行にコマンドを挿入すると、コマンドが$()実行され、出力が置き換えられます。

$ grep 'search' $(find …)

\'"ファイル名にスペースやその他の「奇妙な文字」(xargsの場合\[*?)が含まれていると、これらのコマンドは機能しません$(find …)


しかし、特定の状況では、find与えられた引数に基づいてプログラムを実行する機能が組み込まれています。

$ find … -exec grep 'search' {} \;

-execとの間のすべての内容は;実行されるコマンドです。{}見つかったファイル名に置き換えられますfind。これはgrep、各ファイルに対して別々のタスクを実行します。複数のファイル名をインポートしてすべて検索できるため、findに一致するすべてのファイル名を一度に渡すようにgrep変更できます。;+grep

$ find … -exec grep 'search' {} \+

答え2

一部のバージョンgrep(例:組み込みのLinuxまたはBSDまたはMac OS X)再帰的に検索するオプションがあります-r。 OpenBSDでは-R--exclude以下の例のように使用せずに)使用してください。これfindには、との単純な組み合わせが含まれますgrep

実装に対応するフラグがない-R場合、またはより高度なファイル一致条件が必要な場合は、-execmainを使用してfind実行させることができますgrep。いくつかの以前の実装は...findをサポートしていません。これらのシステムでは、theの代わりにaを使用してください(これはファイルごとに1回呼び出されるため、遅くなりますが、そうでない場合は結果は同じです)。単一ファイルから呼び出されてもファイル名を表示するトリックに注意してください(GNU grepとFreeBSD / NetBSD / OSX grepには同じ効果を得るためのオプションがあります)。-exec+;+grep/dev/nullgrep-H

find . -type f -name '*.o' -prune -o -exec grep 'needle' /dev/null {} +
grep -r --exclude='*.o' 'needle' .

答え3

find ... | while read line; do grep <regex> "$line"; done

答え4

例:

名前に「Delay」があり、見つかったファイルのどこかに「Create」があるファイルを検索します。

find . | grep Delay | xargs grep 'Create'

その後、何かが見つかったら、「Create」という単語が書かれたすべての行を表示する必要があります。

関連情報