Grepを使用して文字列 "hello"を含むすべてのファイルをカレントディレクトリで検索し、.hファイルと.ccファイルのみを表示するにはどうすればよいですか。
grep -r --include=*.{cc,h} "hello" .
この.
(現在の)ディレクトリに "hello"を含むすべての.cc OR .hファイルを再帰的に(すべてのサブディレクトリで)検索します。
ファイル名を指定したりstdinを使用したりする代わりに、ワイルドカードを渡すことができます。
grep hello *.h *.cc
find . -name \*.cc -print0 -or -name \*.h -print0 | xargs -0 grep "hello"
。
詳細についてはfind
とxargs
のマニュアルページをチェックしてください。
私があなたの質問を注意深く読んだならば、あなたは "現在のディレクトリを検索するためにgrepに尋ねますanyとすべてのファイルを含む文字列"こんにちは"と.hと.ccファイルのみを表示します "#:。だからあなたの正確な要件を満たすためにここに私の提出です:
ファイル名が表示されます。
grep -lR hello * | egrep '(cc|h)$'
...これはファイル名と内容を表示します。
grep hello `grep -lR hello * | egrep '(cc|h)$'`
現在のディレクトリを再帰的に検索するには:
grep -r 'myString' .
再帰検索が必要な場合は、さまざまな選択肢があります。 ack
を考慮する必要があります。
それに失敗し、GNU find
とxargs
がある場合:
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バージョンのfind
とxargs
で動作します。
grep -l hello **/*.{h,cc}
.hファイルも.ccファイルもない場合は、エラーメッセージを回避するためにshopt -s nullglob
を使用することをお勧めします。