Когда я хочу выполнить рекурсивный поиск grep в текущем каталоге, я обычно делаю:
grep -ir "string" .
Но эта команда выполняет поиск во всех видах файлов, включая двоичные файлы (изображения, аудио, видео и т. Д.), Что приводит к очень медленному процессу поиска.
Если я сделаю это, например, это не сработает:
grep -ir "string" *.php
Это не работает, потому что в текущем каталоге нет файлов PHP, но внутри некоторых подкаталогов в текущем каталоге, а имена подкаталогов не заканчиваются на «.php», поэтому grep не заглядывает внутрь них.
Итак, как я могу сделать рекурсивный поиск из текущего каталога, но также указав подстановочные знаки имени файла? (т.е.: поиск только в файлах, которые заканчиваются определенным расширением)
grep -ir "string" --include="*.php" *
Если у вас есть версия, в
grep
которой отсутствует--include
опция, вы можете использовать следующее. Оба они были протестированы на структуре каталогов, как это:Где все
.php
файлы содержат строкуstring
.использование
find
объяснение
Это найдет все
.php
файлы и затем запуститgrep -H string
каждый из них. Сfind
«S-exec
варианта,{}
заменяются каждый из найденных файлов.-H
Говоритgrep
печатать имя файла, а также согласованную линию.Предполагая, что у вас достаточно новая версия
bash
, используйтеglobstar
:объяснение
Как объяснено в руководстве по bash :
Таким образом, запустив,
shopt -s globstar
вы активируете функцию иglobstar
опцию Bash, которая позволяет**/*php
развернуть все.php
файлы в текущем каталоге (**
соответствует 0 или более каталогам, так же**/*php
соответствует./foo.php
), которые затем выбираютсяstring
.источник
использование
*/*.php
Это делает поиск grep одним уровнем подкаталога
источник