web-dev-qa-db-ja.com

特定のフォルダにあるファイルでのみGrepを実行する

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さ​​れません。

2
snurden

私がこれを正しく理解しているなら、あなたは次のようなものを探しています:

find . -path "*/myfolder/myfile.out" -exec grep <string> /dev/null {} +
2
BitsOfNix

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'