grepを使用して、「hello」という文字列を持つすべてのファイルを現在のディレクトリで検索しながら、.hファイルと.ccファイルのみを表示するにはどうすればよいですか?


138

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

回答:


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

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

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


5
元の投稿で「現在のディレクトリ」と言っていましたが、再帰的にまたはサブディレクトリでそれを必要とすることについては何もありませんでした(後の投稿で説明しました)。現在のディレクトリでのみそれを行う方法に興味がある人は、それはgrep -si "hello" --include=*.{cc,h} ./* ./.*(隠しファイルも検索する)です。以下は、すべてのファイルまたは非表示のファイルで文字列を検索するための一般的なバージョンですgrep -s "hello" * .*。たぶん、最も一般的に便利な(そして最も単純な)「こんにちは」のために、この検索すべての非隠されたファイル:grep -si "hello" ./* この投稿への感謝:askubuntu.com/a/777456
jbobbins

1
grep -r --include=*.{java,py} "hello" .

何らかの理由で、GNU grepユーティリティを使用している場合でも、これはmacOSでは機能しません。
xApple

49

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

grep hello *.h *.cc

すべてのサブディレクトリも必要です
stackoverflow

-R残念ながら追加は機能しません。*再帰的に行く前に展開します。
ドナルドマイナー

Noufalの答えは、サブディレクトリが必要な場合に探しているものです
Donald Miner

8
@Jammin質問するときは、それについて明確にする必要があります。この答えは、あなたが述べた質問に対する「正しい」答えです。
ヨルダン2012

$ grep -R hello *#すべての単語から、helloを含む(サブディレクトリを含む)を検索します

19

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

マニュアルページをチェックfindしてxargs詳細を。


1
あなたは持っている必要があります-print0後に'*.cc'そうでなければ、検索のその部分のためのアクションを持っていないよう。または、そこに括弧を挿入する必要がありますfind . \( -name '*.cc' -or -name '*.h' \) -print0
ジョナサンレフラー、2012

お気づきありがとうございます。答えを「修正」するために編集しました。
Noufal Ibrahim

3
find -exec +xargsの代わりに構文を使用することもできます
jordanm

@jordanm:はい:-exec grep "hello" {} +中括弧のペアはファイル名を表します。良い提案。
ジョナサンレフラー、2012

10

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

grep -r 'myString' .

5

再帰的な検索が必要な場合は、さまざまなオプションがあります。あなたは考慮すべき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

これは、パターンマッチがファジィ(しかし単純)であるため、意図しないいくつかの名前を取得する可能性がありますが、それ以外の場合は機能します。また、findおよびの非GNUバージョンで動作しxargsます。


あなたが言うこともできることに注意してくださいfind ... -exec grep "hello" {} +
fedorqui 'SO stop harming'

5

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

これはファイル名を表示します:

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

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

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

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

shopt -s nullglob.hファイルまたは.ccファイルがない場合は、エラーメッセージを回避したい場合があります。


4
私はグーグルなどの使い方を知っています。いくつかの回答に「-l」が付いており、すべての情報を1か所にまとめておくと便利なので、ここで質問しました。
Andrew Swift

-l(小文字の "el")通常の出力を抑制します。通常は出力が出力される各入力ファイルの名前を出力します。スキャン/検索は最初の一致で停止します。
レックスCoolCode Charles

-1

最も簡単な方法:grep -Ril "Your text" /


1
これは.hまたは.ccファイルのみを表示するわけではなく、使用したオプションとその理由を説明するのに役立ちます。
kon psych
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.