Универсальная команда grep позволяет выполнять поиск текста во всех файлах и всех подкаталогах каталога.
Grep – это отличный инструмент, когда вам нужно выполнить поиск по содержимому файла.
Обычно вы запускаете grep на одном файле, например, так:
grep search_term filename
Grep достаточно универсален.
Если вы хотите найти все файлы в каталоге с помощью grep, используйте его следующим образом:
grep search_term *
С этим есть проблема.
Он ищет только во всех файлах в текущем каталоге.
Он не будет искать в подкаталогах.
Вы можете заставить grep искать во всех файлах и во всех подкаталогах текущего каталога, используя опцию -r рекурсивного поиска:
grep -r search_term .
Вы также можете указать путь к каталогу, если вы находитесь не в том каталоге, в котором хотите выполнить поиск:
grep -r search_term directory_path
Это был краткий обзор.
Позвольте мне показать вам все это в деталях с соответствующими примерами, чтобы вам было легче понять.
Поиск Grep во всех файлах каталога
Вот структура каталогов, которую я собираюсь использовать в этом примере.
За исключением файла empty.txt, все файлы содержат термин ‘simple’, по которому я буду выполнять поиск grep.
~/scripts$ tree
.
├── dir1
│ └── new_script.sh
├── dir2
│ └── your_script.sh
├── dir3
│ ├── empty.txt
│ └── linked.txt -> ../../sample.txt
├── my_script.sh
└── your_script.sh
3 directories, 6 files
Для поиска слова ‘simple’ во всех файлах текущей директории достаточно использовать подстановочный знак (*).
grep simple *
Это приведет к поиску во всех файлах в текущих каталогах, но не зайдет в подкаталоги.
Поскольку вы не можете напрямую искать grep в каталоге, система выдаст ошибку “XYZ is a directory” вместе с результатами поиска.
Если вы находитесь не в том же каталоге, в котором хотите выполнить, вы можете указать путь к каталогу и закончить его символом /*
grep search_term directory_path/*
По сути, вы используете * для расширения всех элементов (файлов и каталогов) данного каталога.
Теперь, когда вы это знаете, давайте посмотрим, как можно выполнить рекурсивный поиск с помощью grep, чтобы он также просматривал файлы в подкаталогах.
Рекурсивный поиск Grep во всех подкаталогах каталога
Grep предоставляет опцию -r для рекурсивного поиска.
С этой опцией grep будет искать все файлы в текущем (или указанном) каталоге, а также все файлы во всех подкаталогах.
Вот рекурсивный поиск, который я выполнил в предыдущем примере:
grep -r simple .
Существует также опция -R для рекурсивного поиска, и она работает почти так же, как опция -r.
grep -R simple .
Итак, в чем разница между grep -r и grep -R?
На самом деле, только одна.
Поиск -R является поиском с разыменованием, что означает, что он будет следовать по символическим ссылкам, чтобы перейти к исходному файлу (который может находиться в какой-то другой части системы).
Если вы находитесь не в том каталоге, в котором хотите выполнить рекурсивный поиск, просто укажите команде grep абсолютный или относительный путь к каталогу:
grep -r search_term path_to_directory
Бонусный совет: Как исключить определенный каталог из рекурсивного поиска grep
Все вроде бы хорошо, но что если вы хотите исключить определенный каталог из рекурсивного поиска?
Для этого тоже есть соответствующая возможность.
Я уже говорил вам, что grep – чрезвычайно универсальная команда.
grep -r --exclude-dir=dir_name serach_term directory_path
Это еще не все.
Вы можете исключить из рекурсивного поиска более одного подкаталога следующим образом:
grep -r --exclude-dir={dir1,dir2} serach_term directory_path
Подведем итоги
Вот краткий обзор использования поиска grep для нескольких файлов и каталогов:
Команда Grep | Описание |
---|---|
grep string * | Поиск во всех файлах в текущем каталоге |
grep string dir | Поиск во всех файлах в каталоге dir |
grep -r string . | Рекурсивный поиск во всех файлах во всех подкаталогах |
grep -r string dir | Рекурсивный поиск во всех файлах во всех подкаталогах каталога dir |
grep -R string . | То же, что и r, но следует за символическими ссылками |
см. также:
- 🧾 Как скачать, установить и использовать GNU Grep в Windows?
- ngrep – Сетевой анализатор пакетов для Linux