web-dev-qa-db-ja.com

grep、ただの特定のファイル拡張子みみ

私はいくつかのスクリプトをgrep特定のディレクトリに書くことに取り組んでいます、しかしこれらのディレクトリはあらゆる種類のファイルタイプを含みます。

私は今のところgrep.h.cppだけにしたいのですが、将来的には他にも少数の人がいるでしょう。

これまでのところ私は持っています:

{ grep -r -i CP_Image ~/path1/;

grep -r -i CP_Image ~/path2/;

grep -r -i CP_Image ~/path3/;

grep -r -i CP_Image ~/path4/;

grep -r -i CP_Image ~/path5/;} 

| mailx -s GREP [email protected]

特定のファイル拡張子だけを追加する方法を他の人に教えてもらえますか。

798
Jason

このように--includeパラメータを使うだけです。

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP [email protected]

それはあなたが望むことをするべきです。

構文に関する注意事項

  • -r - 再帰的に検索する
  • -i - case - 鈍感 search
  • --include=\*.${file_extension} - 拡張子またはファイルパターンのみに一致するファイルを検索します
1110
Nelson

これらの答えの中には構文が多すぎるように思えるものもあれば、私のDebianサーバで問題を引き起こすものもありました。これは私のために完璧に働いた:

PHP革命:Linuxでファイルをgrepする方法、しかし特定のファイル拡張子だけ?

すなわち:

grep -r --include=\*.txt 'searchterm' ./

...または大文字と小文字を区別しないバージョン...

grep -r -i --include=\*.txt 'searchterm' ./
  • grep:コマンド

  • -r:再帰的

  • -i:無視するケース

  • --include:all * .txt:テキストファイル(ファイル名にアスタリスクがあるディレクトリがある場合に備えて、\でエスケープします)

  • 'searchterm':何を検索するか

  • ./:現在のディレクトリから始めます。

234
HoldOffHunger

どうですか?

find . -name '*.h' -o -name '*.cpp' -exec grep "CP_Image" {} \; -print
47
Amir Afghani
grep -rnw "some thing to grep" --include=*.{module,inc,php,js,css,html,htm} ./
43
Yuri Malov

HPサーバーとSunサーバーには-rオプションはありません。この方法は私のHPサーバーではうまくいきました。

find . -name "*.c" | xargs grep -i "my great text"

-iは、大文字と小文字を区別しない文字列の検索用です。

15
Sam B

これは の問題であるため、 ファイルを見つけてください。findを使ってみましょう。

GNU findを使用すると、-regexオプションを使用して、拡張子が.hまたは.cppのいずれかであるディレクトリのツリーからそれらのファイルを見つけることができます。

find -type f -regex ".*\.\(h\|cpp\)"
#            ^^^^^^^^^^^^^^^^^^^^^^^

それから、それぞれの結果に対してgrepを実行するだけです。

find -type f -regex ".*\.\(h\|cpp\)" -exec grep "your pattern" {} +

このようなfindの分布がない場合は、 Amir Afghaniの のように、オプションを連結するために-oを使用する必要があります( 名前は.hで終わるか.cppで終わります)。

find -type f \( -name '*.h' -o -name '*.cpp' \) -exec grep "your pattern" {} +
#            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

grepを本当に使用したい場合は、--includeに示された構文に従ってください。

grep "your pattern" -r --include=*.{cpp,h}
#                      ^^^^^^^^^^^^^^^^^^^
11
fedorqui

最も簡単な方法は

find . -type  f -name '*.extension' | xargs grep -i string 
7
user3640130

私はこの質問が少し時代遅れであることを承知しています、しかし私は私が通常見つけるために使う方法を共有したいです .c そして .h ファイル:

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -H "#include"

行番号も必要な場合は、

tree -if | grep \\.[ch]\\b | xargs -n 1 grep -nH "#include"
3
Tom

以下の答えはいいです。

grep -r -i --include \*.h --include \*.cpp CP_Image ~/path[12345] | mailx -s GREP [email protected]

しかしに更新することができます:

grep -r -i --include \*.{h,cpp} CP_Image ~/path[12345] | mailx -s GREP [email protected]

これはもっと簡単になります。

2
hao

ag(銀の検索者)はこれのためのかなり簡単な構文を持っています

       -G --file-search-regex PATTERN
          Only search files whose names match PATTERN.

そう

ag -G *.h -G *.cpp CP_Image <path>
2
Eldamir

それぞれの "-o -name"に対して "-exec grep"を書くべきです

find . -name '*.h' -exec grep -Hn "CP_Image" {} \; -o -name '*.cpp' -exec grep -Hn "CP_Image" {} \;

または()でそれらをグループ化する

find . \( -name '*.h' -o -name '*.cpp' \) -exec grep -Hn "CP_Image" {} \;

option '-Hn'はファイル名と行を表示します。

1
where23