記録のために、ここに私が好むアプローチがあります:
grep pattern $(find . -type f ! -path './test/main.cpp')
grepコマンドの先頭を保持することで、これはもう少し明確になったと思います-さらに、grep色の強調表示を無効にしません。ある意味でfindは、コマンド置換での使用は、grep機能の(制限された)ファイル検索サブセットを拡張/置換する方法にすぎません。
私にとって、find -exec構文は一種の不可解です。複雑な点の1つfind -execは、(場合によっては)さまざまな文字をエスケープする必要があることです(特に\;Bashで使用する場合)。おなじみのコンテキストに物事を入れるためだけに、次の2つのコマンドは基本的に同等です。
find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern
サブディレクトリを除外する場合は、ワイルドカードを使用する必要がある場合があります。ここでスキーマを完全に理解していません- 秘儀について話してください:
grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )
スクリプトで使用するためのfindベースのソリューションを一般化するためのもう1つの注意:grepコマンドラインには-H/ --with-filenameオプションを含める必要があります。それ以外の場合は、からの検索結果にファイル名が1つしか存在しないという状況下で、出力のフォーマットを変更しますfind。これはgrep、(の-rオプションを使用して)のネイティブファイル検索を使用する場合には必要ないように見えるため、注目に値します。
...さらに良いのは、/dev/null検索する最初のファイルとして含めることです。これにより、2つの問題が解決されます。
- 検索するファイルが1つある場合、
grep2つあると判断し、複数ファイル出力モードを使用します。
- これにより、検索するファイルがない場合、
grep1つのファイルがあると見なされ、stdinで待機することがなくなります。
最終的な答えは:
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')
--exclude-dir)、問題は拡大します。だからこそ、grepにネイティブに除外を実行させたいのです。