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"
- 🐧 Как найти все файлы размером более 1 ГБ на Linux
- 👸 Как использовать на Linux команду find для поиска файлов
- 🐧 Как ограничить количество доступных процессоров
- 🐧 Как найти файлы по имени без учета регистра на Linux
- 🇺🇳 Как найти и удалить файлы старше определенного периода времени в Linux
- Как найти повторяющиеся файлы в Linux и удалить их
- Как найти и удалить файлы старше X дней в Linux
- 📁 Как удалить все файлы из каталога на Linux