🐧 Как выполнить поиск Grep по всем файлам и во всех каталогах

by itisgood

Универсальная команда 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, но следует за символическими ссылками

см. также:

 

You may also like

Leave a Comment