web-dev-qa-db-ja.com

grepを使って現在のディレクトリから "hello"という文字列を持ち、.hファイルと.ccファイルのみを表示するすべてのファイルを検索するにはどうすればよいですか。

Grepを使用して文字列 "hello"を含むすべてのファイルをカレントディレクトリで検索し、.hファイルと.ccファイルのみを表示するにはどうすればよいですか。

123
stackoverflow
grep -r --include=*.{cc,h} "hello" .

この.(現在の)ディレクトリに "hello"を含むすべての.cc OR .hファイルを再帰的に(すべてのサブディレクトリで)検索します。

別のスタックオーバーフローの質問から

146
stackoverflow

ファイル名を指定したりstdinを使用したりする代わりに、ワイルドカードを渡すことができます。

grep hello *.h *.cc
45
Donald Miner

find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello"

詳細についてはfindxargsのマニュアルページをチェックしてください。

19
Noufal Ibrahim

私があなたの質問を注意深く読んだならば、あなたは "現在のディレクトリを検索するためにgrepに尋ねますanyとすべてのファイルを含む文字列"こんにちは"と.hと.ccファイルのみを表示します "#:。だからあなたの正確な要件を満たすためにここに私の提出です:

ファイル名が表示されます。

grep -lR hello * | egrep '(cc|h)$'

...これはファイル名と内容を表示します。

grep hello `grep -lR hello * | egrep '(cc|h)$'`
5
Jack

現在のディレクトリを再帰的に検索するには:

grep -r 'myString' .
5
AB Abhi

再帰検索が必要な場合は、さまざまな選択肢があります。 ack を考慮する必要があります。

それに失敗し、GNU findxargsがある場合:

find . -name '*.cc' -print0 -o -name '*.h' -print0 | xargs -0 grep hello /dev/null

/dev/nullを使用すると、ファイル名を確実に印刷できます。 -print0-0は、スペースを含むファイル名(改行など)を扱います。

あなたが(スペースなどで)邪魔な名前を持っていないなら、あなたは使うことができます:

find . -name '*.*[ch]' -print | xargs grep hello /dev/null

これはあなたが意図しないいくつかの名前を拾うかもしれません、なぜならパターンマッチはあいまいです(しかしより単純です)が、そうでなければうまくいきます。そしてそれは非GNUバージョンのfindxargsで動作します。

4
grep -l hello **/*.{h,cc}

.hファイルも.ccファイルもない場合は、エラーメッセージを回避するためにshopt -s nullglobを使用することをお勧めします。

2
glenn jackman