Use grep
's --include
option:
grep -ir "string" --include="*.php" .
Когда я хочу выполнить рекурсивный поиск grep в текущем каталоге, я обычно делаю:
grep -ir "string" .
Но эта команда выполняет поиск во всех видах файлов, включая двоичные файлы (изображения, аудио, видео и т. Д.), Что приводит к очень медленному процессу поиска.
Если я сделаю это, например, это не сработает:
grep -ir "string" *.php
Это не работает, потому что в текущем каталоге нет файлов PHP, но внутри некоторых подкаталогов в текущем каталоге, а имена подкаталогов не заканчиваются на «.php», поэтому grep не заглядывает внутрь них.
Итак, как я могу сделать рекурсивный поиск из текущего каталога, но также указав подстановочные знаки имени файла? (т.е.: поиск только в файлах, которые заканчиваются определенным расширением)
Use grep
's --include
option:
grep -ir "string" --include="*.php" .
Если у вас есть версия, в grep
которой отсутствует --include
опция, вы можете использовать следующее. Оба они были протестированы на структуре каталогов, как это:
$ 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
«S -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 :
globstar
Если установлено, шаблон '**', используемый в контексте расширения имени файла, будет соответствовать всем файлам и нулю или более каталогов и подкаталогов. Если за шаблоном следует символ «/», совпадут только каталоги и подкаталоги.
Таким образом, запустив, shopt -s globstar
вы активируете функцию и globstar
опцию Bash, которая позволяет **/*php
развернуть все .php
файлы в текущем каталоге ( **
соответствует 0 или более каталогам, так же **/*php
соответствует ./foo.php
), которые затем выбираются string
.
использование */*.php
Это делает поиск grep одним уровнем подкаталога