interesting string
をgrepしたいのですが、myfolder/myfile.out
などの特定のフォルダ/ファイルの組み合わせのみです。
私がgrepしているディレクトリは、さまざまな深さのサブディレクトリにこれらの組み合わせがある可能性があり(そうでない場合は、grep 'interesting string' myfolder/myfile.out
だけである可能性があります)、次のディレクトリにあるmyfile.out
から結果を取得したくありません。別の名前、たとえば/deeply/nested/directory/structure/myfolder/myfile.out
はgrepされますが、/deeply/nested/directory/structure/notmyfolder/myfile.out
はgrepされません。
私がこれを正しく理解しているなら、あなたは次のようなものを探しています:
find . -path "*/myfolder/myfile.out" -exec grep <string> /dev/null {} +
Zshでは、**/
glob は、「任意のレベルのディレクトリネストの下」を意味します。
grep 'interesting string' **/myfolder/myfile.out
Bashの場合:shopt -s globstar
次に上記のように。 bash≤4.2では、これはディレクトリへのシンボリックリンクをトラバースすることに注意してください。この機能は、OSXのbashの古いバージョンにはまだ存在しません。
Ksh93の場合:set -G
次に上記のように。
これは、ファイル名の全長が長すぎると失敗する可能性があります。この場合、find
を呼び出してgrep
をバッチで実行するようにフォールバックできます。
find -path '*/myfolder/myfile.out' -exec grep -H 'interesting string' {} +
またはあなたがGNUツールに頼ることができない場合:
find -name myfolder -exec sh -c 'grep "$0" /dev/null "$1/myfile.out"' 'interesting string' {} \;
ただし、zshを使用している場合は、 zargs
:
zargs -- **/myfolder/myfile.out -- grep 'interesting string' /dev/null
別のアプローチは、grepとディレクトリトラバーサルをGNU grepよりも優れた方法で組み合わせる別のツールを使用することです。たとえば、 シルバーサーチャー を使用できます。
ag -G '/myfolder/myfile\.out$' 'interesting string'