web-dev-qa-db-ja.com

ディレクトリの下のすべてのファイルをgrepする簡単な方法はありますか?

ツリー全体でコンテンツを検索したい場合は、

find . -type f -print0 | xargs -0 grep <search_string>

パフォーマンスまたは簡潔さの観点からこれを行うより良い方法はありますか?

21
Dancrumb

grep-rオプションをサポートしているかどうかを確認します(recurseの場合):

grep -r <search_string> .
43
Philippos

次善の答え:findの出力をgrepにパイプする代わりに、単に実行することができます

find . -type f -exec grep 'research' {} '+'

そして出来上がり、2つではなく1つのコマンド!

説明 :

find . -type f

内のすべての通常のファイルを検索します。

-exec grep 'research'

grep 'research'

{}

見つかったファイル名

'+'

ファイル名ごとに1回ではなく、すべてのファイル名ごとに1つのコマンドを使用します。

Nb:';'を使用すると、ファイル名ごとに1回必要になります。

それ以外に、それを使用してソースコードを処理する場合は、コードビットを簡単に検索するために作成されたackを調べることができます。

ack

編集:

その研究を少し拡張することができます。最初に、find-name ''スイッチを使用して、特定の命名パターンを持つファイルを検索できます。

例えば ​​:

  • ログに対応するファイルのみ:-name '*.log'

  • cヘッダーに対応するファイルのみですが、ファイル名拡張子は大文字または小文字に固執できません:-iname *.c

Nb:grepackと同様に、-iスイッチは、この場合、大文字と小文字を区別しないことを意味します。

その場合、grepは色と行番号なしで表示されます。

--colorおよび-nスイッチを使用して、これを変更できます(それぞれ、ファイルの色と行番号)。

最後に、あなたは次のようなものを持つことができます:

find . -name '*.log' -type f -exec grep --color -n 'pattern' {} '+'

例えば

$ find . -name '*.c' -type f -exec grep -n 'hello' {} '+' 
./test2/target.c:1:hello

サブディレクトリに再帰する場合:

grep -R 'pattern' .

-Rオプションは標準オプションではありませんが、最も一般的なgrep実装でサポートされています。

12
Kusalananda

上記のように、-rまたは-R(必要なシンボリックリンクの処理に応じて)は簡単なオプションです。

ただし、-d <action>が役立つ場合があります。

-dのいいところは、現在のレベルをスキャンしたいだけのときに「grep:directory_name:Is a directory」を表示しないskipコマンドです。

$ grep foo * 
grep: q2: Is a directory 
grep: rt: Is a directory 

$ grep -d skip foo *  
$ 

そしてもちろん:

$ grep -d recurse foo * 
(list of results that don't exist because the Word foo isn't in our source code
and I wouldn't publish it anyway).  
$ 

-d skipオプションは別のスクリプト内で本当に便利なので、2> /dev/nullを使用する必要はありません。 :)

5
Petro

多くのファイルを処理している場合、サブフォルダー内のすべてのファイルをgrepするのではなく、検索する必要があるファイルを削除すると、grepの実行が速くなります。

私は時々このフォーマットを使用します:

grep "primary" `find . | grep cpp$`

cppで終わる.のサブフォルダー内のすべてのファイルを検索します。次に、これらのファイルを「プライマリ」にgrepします。

必要に応じて、これらの結果をさらにgrep呼び出しにパイプすることができます。

grep "primary" `find . | grep cpp$` | grep -v "ignoreThis" | grep -i "caseInsensitiveGrep"
0
Rudy