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