ワイルドカードを使用して、必要なファイルの名前を再帰的にフィルタリングする「grep」を実行するにはどうすればよいですか?


40

現在のディレクトリで再帰的なgrep検索を実行する場合、通常は次のようにします。

grep -ir "string" .

しかし、このコマンドは、バイナリファイル(画像、オーディオ、ビデオなど)を含むあらゆる種類のファイル内を検索するため、検索プロセスが非常に遅くなります。

たとえば、これを行うと、機能しません。

grep -ir "string" *.php

現在のディレクトリ内にPHPファイルが存在しないため機能しませんが、現在のディレクトリ内のいくつかのサブディレクトリ内にあり、サブディレクトリの名前は ".php"で終わらないため、grepは内部を調べません。

だから、現在のディレクトリから再帰検索を行うことができますが、ファイル名ワイルドカードも指定できますか?(つまり、特定の拡張子で終わるファイルのみを検索します)

回答:


58

grep--includeオプションを使用:

grep -ir "string" --include="*.php" .

1
OK、私のオプションのgrepは古いようです。なぜなら、そのオプションがなかったからです(どうしてこれを行うことができないのか不思議ではありません!)。「grep:unrecognized option `--include = *。php '」というメッセージが表示されました。しかし、私は新しいものにアップグレードしましたが、今では動作します。ありがとうございました!
OMA

最後にピリオドを置き換えて使用する必要がありgrep -ir "string" --include="*.php" *
Stuart

私は期間がちょうど行の終わりだと思った!使用も必要もありませんでした。
-boardtc

14

オプションのgrepないバージョンがある--include場合は、次を使用できます。これらは両方とも、次のようなディレクトリ構造でテストされました。

$ tree
.
├── a
├── b
   └── foo2.php
├── c
   └── d
       └── e
           └── f
               └── g
                   └── h
                       └── foo.php
├── foo1.php
└── foo.php

すべての.phpファイルに文字列が含まれる場合string

  1. つかいます find

    $ find . -name '*php' -exec grep -H string {} +
    ./b/foo2.php:string
    ./foo1.php:string
    ./c/d/e/f/g/h/foo.php:string

    説明

    これにより、すべての.phpファイルが検索さgrep -H stringれ、それぞれで実行されます。オプション、見つかったファイルのそれぞれに置き換えられます。伝えファイル名だけでなく、マッチした行を印刷します。find-exec{}-Hgrep

  2. の新しい十分なバージョンがあると仮定してbash、使用しますglobstar

    $ shopt -s globstar
    $ grep -H string  **/*php
    b/foo2.php:string
    c/d/e/f/g/h/foo.php:string
    foo1.php:string

    説明

    bashマニュアルで説明されているように:

    グロブスター

    設定されている場合、ファイル名展開コンテキストで使用されるパターン「**」は、すべてのファイルとゼロ個以上のディレクトリとサブディレクトリに一致します。パターンの後に「/」が続く場合、ディレクトリとサブディレクトリのみが一致します。

    したがって、実行shopt -s globstarすると、現在のディレクトリ内のすべてのファイルに展開する機能とBashのglobstarオプションをアクティブにし(0以上のディレクトリに一致するため、一致する)、grepさ​​れます。**/*php.php****/*php./foo.phpstring


-2

つかいます */*.php

これにより、grep検索は1レベルのサブディレクトリになります


アスタリスクとドットが消えたため、何かがおかしくなりました。
デニスノーラン

バックティックを使用してコードをフォーマットし、マークダウンフォーマットを強調するためのアスタリスクの使用に関する曖昧さを回避できます。PSは、質問が最終段落の「再帰的検索」について尋ねていることに注意してください(ただし、私の投票ではありません)。
RedGrittyBrick

あなたが言及したように、それは1レベルの深いディレクトリ構造にのみ適しているが、それにもかかわらずそれでも知るのは良いので、正しい答えではありません;)。それに対する私の賛成票。
OMA
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.