Как использовать grep рекурсивно в определенных расширениях файлов
grep
– отличный инструмент для поиска файлов и стандартного ввода в Linux, который может сопоставлять строки и шаблоны регулярных выражений. Однако иногда необходимо контролировать, какие типы файлов ищет grep
, и для этого в него встроены флаги.
Включение только определенных файлов в поиск grep
По умолчанию grep
ищет все файлы в заданной папке и ее подпапках, если вы вызываете ее с рекурсивным флагом -r
. Это подберет все, но если вам нужны только определенные расширения, вы можете использовать параметр --include.
Флаг --include
указывает grep
включать только файлы, соответствующие определенному шаблону. Если он указан, grep
будет рассматривать все включенные флаги как белый список. Вы можете использовать это с любыми символами глобуса Linux, такими как подстановочные знаки, чтобы соответствовать всему, включая определенное расширение:
grep -inr --include \*.txt "foo" ~/folder
Обратите внимание, что перед ним используется обратная косая черта \
, потому что в именах файлов могут быть звездочки. Вы также можете указать несколько флагов --include
, например, для поиска всех исходных файлов HTML, JS и CSS в wwwroot:
grep -inr --include \*.html --include \*.css --include \*.js "foo" ~/folder
Аналогичным образом вы также можете исключить определенные имена файлов, которые по-прежнему будут соответствовать всему, кроме glob, действуя как черный список поверх существующей конфигурации:
grep -inr --exclude \*.txt "foo" ~/folder
Также есть флаг для исключения сразу целых каталогов:
grep -inr --exclude-dir config "foo" ~/folder
Использование поиска вместо
В качестве альтернативы, если вы предпочитаете использовать утилиту find
для поиска в файлах, вы можете подключить ее к grep
с помощью конвейеров и xargs
. find
может выполнять поиск с использованием шаблонов и регулярных выражений и имеет ряд преимуществ, в том числе возможность простой фильтрации файлов на основе метаданных, таких как размер, дата создания и изменения, а также других идентификаторов Linux.
Команда немного бестолковая, так как вам нужно будет использовать -print0
в конце find
, чтобы распечатать однострочный список, а затем передать его в xargs -0
и grep
оттуда.
find ./ -type f -iname "*.txt" -print0 | xargs -0 grep "foo"