117

あるディレクトリにあるすべてのhtmlファイルをgrepしたい場合は、次のようにします。

grep --include="*.html" pattern -R /some/path

これはうまく機能します。問題は、あるディレクトリにあるすべてのhtml、htm、phpファイルをgrepする方法です。

これからgrep--exclude/-include構文を使用して、特定のファイルをgrepしないようにします。次のことができるようです。

grep --include="*.{html,php,htm}" pattern -R /some/path

しかし悲しいことに、それは私にはうまくいきませんでした。
参考までに、私のgrepバージョンは2.5.1です。

4

7 に答える 7

162

複数の--includeフラグを使用できます。これは私のために働きます:

grep -r --include=*.html --include=*.php --include=*.htm "pattern" /some/path/

ただし、 Deruijterが提案したように行うことができます。これは私のために働きます:

grep -r --include=*.{html,php,htm} "pattern" /some/path/

この種のことにもfind使用できることを忘れないでください:xargs

find /some/path/ -name "*.htm*" -or -name "*.php" | xargs grep "pattern"
于 2012-05-16T23:52:45.880 に答える
41

の使用は、、、、およびの非標準(POSIX準拠ではない)機能であるブレース拡張{html,php,htm}としてのみ機能します。bashkshzsh

  • 言い換えると、ターゲットとするスクリプトで使用しないでください。その場合は、明示的な複数の引数を/bin/sh使用してください。--include

  • grepそれ自体は表記法を理解していません。{...}

ブレース拡張が認識されるためには、コマンドラインで引用符で囲まれていない(aの一部)トークンである必要があります。

ブレース展開複数の引数に拡張されるため、手元にある場合は、個別に渡した場合と同じように、複数のオプションが表示grepされます。 --include=...

ブレース拡張の結果は、落とし穴があるグロブ(ファイル名拡張)の対象になります

  • 結果として得られる各引数は、.などの引用符で囲まれていないグロブメタ文字が含まれている場合は、一致するファイル名にさらに拡張できます*
    これは、次のようなトークンでは起こりそうにありませんが(たとえば、一致するもののように文字通り名前--include=*.htmlが付けられたファイルが必要になる場合)、一般的に覚えておく価値があります。--include=foo.html

  • nullglobシェルオプションがたまたまオンになっていて(shopt -s nullglob)、グロブがにも一致しない場合、引数は破棄されます。

したがって、完全に堅牢なソリューションの場合は、次を使用します。

grep -R '--include=*.'{html,php,htm} pattern /some/path
  • '--include=*.'一重引用符で囲まれているため、リテラルとして扱われます。これにより、グロブ文字としての不注意な解釈を防ぎます。*

  • {html,php,htm}、-必要に応じて-引用符で囲まれていない中括弧の展開[1]は、 3つの引数に 展開されます。これは、トークン{...} の直後にあるため、その'...'トークン含みます。

  • したがって、シェルによる引用符の削除後、次の3つ のリテラル引数が最終的にに渡されgrepます。

    • --include=*.html
    • --include=*.php
    • --include=*.htm

[1]より正確には、引用符を外す必要があるのは中括弧拡張の構文関連部分のみです。リスト要素は引き続き個別に引用でき、中括弧拡張後に不要なグロブが発生する可能性のあるグロブメタ文字が含まれている場合は、引用する必要があります。この場合は必要ありませんが、上記は次のように書くことができます。
'--include=*.'{'html','php','htm'}

于 2017-05-22T19:56:03.207 に答える
9

二重引用符を削除してみてください

grep --include=*.{html,php,htm} pattern -R /some/path
于 2012-05-16T13:10:07.020 に答える
5

これは機能していませんか?

  grep pattern  /some/path/*.{html,php,htm} 
于 2012-05-16T13:08:03.733 に答える
4

同じ目的で動作しますが、--includeオプションはありません。grep2.5.1でも動作します。

grep -v -E ".*\.(html|htm|php)"
于 2018-08-16T14:10:17.340 に答える
2

これを試して。-rは再帰検索を実行します。-sは、ファイルが見つからないというエラーを抑制します。-nは、パターンが見つかったファイルの行番号を表示します。

    grep "pattern" <path> -r -s -n --include=*.{c,cpp,C,h}
于 2015-10-20T07:09:53.777 に答える
0

コマンドgrepで使用find

find /some/path -name '*.html' -o -name '*.htm' -o -name '*.php' -type f 
 -exec grep PATTERN {} \+

-regex-regextypeオプションも使用できます。

于 2012-05-16T16:22:23.293 に答える