記録のために、ここに私が好むアプローチがあります:
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つある場合、
grep
2つあると判断し、複数ファイル出力モードを使用します。
- これにより、検索するファイルがない場合、
grep
1つのファイルがあると見なされ、stdinで待機することがなくなります。
最終的な答えは:
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')
--exclude-dir
)、問題は拡大します。だからこそ、grepにネイティブに除外を実行させたいのです。