現在のディレクトリで再帰的grep検索を実行したいときは、通常は次のようにします。
grep -ir "string" .
しかし、このコマンドはバイナリファイル(写真、オーディオ、ビデオなど)を含むあらゆる種類のファイル内を検索するため、検索プロセスが非常に遅くなります。
たとえば、これを実行すると、うまくいきません。
grep -ir "string" *.php
現在のディレクトリ内のPHPファイルは存在しないが、現在のディレクトリ内のいくつかのサブディレクトリ内には存在せず、サブディレクトリの名前が ".php"で終わらないため、grep doesn中を見ないでください。
それでは、現在のディレクトリから再帰検索をしながら、ファイル名のワイルドカードを指定するにはどうすればよいでしょうか。 (つまり、特定の拡張子で終わるファイルのみを検索します)
grep
の--include
オプションを使います。
grep -ir "string" --include="*.php" .
--include
オプションのないgrep
のバージョンがある場合、次を使用できます。これらは両方とも、次のようなディレクトリ構造でテストされました。
$ tree
.
├── a
├── b
│ └── foo2.php
├── c
│ └── d
│ └── e
│ └── f
│ └── g
│ └── h
│ └── foo.php
├── foo1.php
└── foo.php
すべての.php
ファイルには、文字列string
が含まれます。
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
にファイル名と一致した行を出力するように指示します。
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されます。