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

Как рекурсивно искать имена каталогов в Linux


В Linux все хранится в каталогах, и при написании bash-скриптов часто бывает полезно искать каталоги по имени. К счастью, вы можете использовать команду find для рекурсивного поиска имен каталогов и отображения совпадений.

Поиск в каталогах

Команда find используется для поиска в каталогах в Linux. По умолчанию он полностью рекурсивный, поэтому будет искать совпадения во всех подкаталогах.

Если вы используете флаг -type d , find будет работать в «режиме каталога» и искать только каталоги, не соответствующие каким-либо файлам. Вы можете использовать его вместе с -name для поиска каталогов по имени:

find . -type d -name "search"

Эта команда запускается в текущем каталоге, но также может выполнять поиск в других каталогах, таких как ~.

Проблема с использованием -name заключается в том, что он будет соответствовать только прямым именам, то есть не будет работать, если он не будет соответствовать полному имени каталога. Однако вы можете использовать подстановочные знаки, чтобы решить эту проблему, и размещение подстановочного знака до и после строки поиска будет соответствовать подстроке в любом месте имени каталога. Если вы также включаете имена файлов, вы можете использовать подстановочные знаки для сопоставления файлов, оканчивающихся на определенное расширение.

find . -type d -name "*search*"

Однако это будет соответствовать только имени каталога и по-прежнему будет игнорировать родительский каталог. Если вы хотите сопоставить, используя весь путь к файлу, вам нужно будет использовать параметр Regex, описанный ниже.

find распечатает список всех подходящих каталогов, но вы должны быть осторожны, чтобы убедиться, что вы последовательно используете абсолютные или относительные пути, потому что это повлияет на окончательный ответ. Если вы используете относительный путь, например точку для «текущего каталога», ответы будут относительными. Но если вы укажете путь напрямую, даже если это текущий каталог, путь будет абсолютным, начиная с корня.

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

Поиск с помощью регулярных выражений

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

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

Вы можете использовать регулярное выражение с -regex вместо -name. Также помогает включить sed-совместимое регулярное выражение с помощью -regextype sed.

находить . -type d -regextype sed -regex “.*one\/.*”

В этом примере регулярное выражение начинается с .*one, чтобы соответствовать всем каталогам, оканчивающимся на «one». Точка и подстановочный знак будут соответствовать любой подстроке, предшествующей этому. Затем косая черта экранируется с помощью \/ , чтобы соответствовать концу каталога, а затем еще один подстановочный знак, соответствующий любому имени каталога.

В целом, это будет соответствовать любому каталогу, родительский элемент которого заканчивается на «единицу», где бы он ни находился, даже в подкаталогах. Regex обладает мощными возможностями, и вы должны быть осторожны, чтобы ваше выражение точно соответствовало тому, что вы хотите, — ни больше, ни меньше.

Использование grep с поиском

Поскольку find может также выводить необработанный список каталогов, его можно передать другим командам для обработки. Например, grep используется в качестве утилиты текстового поиска, и ее можно быстро использовать в командной строке для простого поиска и выделения.

find . -type d | grep foo

grep – это также полноценная поисковая утилита, которую можно использовать с такими инструментами, как регулярные выражения, для улучшения поиска. Вы можете прочитать наше руководство по его использованию, чтобы узнать больше.