Как рекурсивно искать имена каталогов в 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
– это также полноценная поисковая утилита, которую можно использовать с такими инструментами, как регулярные выражения, для улучшения поиска. Вы можете прочитать наше руководство по его использованию, чтобы узнать больше.