Поиск по сайту:

Как использовать 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"