📁 Как использовать grep рекурсивно c определенным расширением файлов

by itisgood

grep – это отличный инструмент для поиска в файлах и стандартном вводе в Linux, который может соответствовать строковым и Regex шаблонам.

Однако иногда необходимо контролировать типы файлов, которые ищет grep, и для этого в него встроены флаги.

Включение в поиск grep только определенные файлы

По умолчанию grep будет искать все файлы в данной папке и ее подпапках, если вы вызовете его с рекурсивным флагом -r.

Это позволит найти все, но если вам нужны только определенные расширения, то лучше использовать опцию –include.

Флаг –include указывает grep включать только файлы, соответствующие определенному шаблону.

Если он указан, grep будет рассматривать все флаги включения как белый список.

Вы можете использовать этот флаг с любыми символами Linux glob, например, с подстановочными знаками для поиска всего, что включает определенное расширение:

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

В качестве альтернативы, если вы предпочитаете использовать утилиту find для поиска файлов, вы можете подключить ее к grep с помощью pipes и xargs.

find может выполнять поиск по шаблонам и Regex и имеет ряд преимуществ, включая возможность легко фильтровать файлы на основе метаданных, таких как размер, дата создания и изменения, и других идентификаторов Linux.

Команда немного туповата, поскольку вам нужно использовать -print0 в конце find, чтобы распечатать однострочный список, а затем передать его в xargs -0 и grep оттуда.

find ./ -type f -iname "*.txt" -print0 | xargs -0 grep "foo"
см. также:

You may also like

Leave a Comment