web-dev-qa-db-ja.com

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

現在のディレクトリで再帰的grep検索を実行したいときは、通常は次のようにします。

grep -ir "string" .

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

たとえば、これを実行すると、うまくいきません。

grep -ir "string" *.php

現在のディレクトリ内のPHPファイルは存在しないが、現在のディレクトリ内のいくつかのサブディレクトリ内には存在せず、サブディレクトリの名前が ".php"で終わらないため、grep doesn中を見ないでください。

それでは、現在のディレクトリから再帰検索をしながら、ファイル名のワイルドカードを指定するにはどうすればよいでしょうか。 (つまり、特定の拡張子で終わるファイルのみを検索します)

36
OMA

grep--includeオプションを使います。

grep -ir "string" --include="*.php" .
50
Dan D.

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

$ 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オプションを使用すると、{}は見つかった各ファイルに置き換えられます。 -Hは、grepにファイル名と一致した行を出力するように指示します。

  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 manual で説明されているように:

    グロブスター

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

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

14
terdon