КОМАНДА FIND В LINUX
Команда find в linux открывает очень много возможностей для поиска информации внутри системы. Чаще всего find я использовал в своих проектах для поиска как файлов, так и данных внутри файлов. Также, очень полезно уметь пользоваться этой командой, если нужно найти что-то «по горячему» на сервере.
Команда find в Linux
Общий синтаксис команды find выглядит так:
find [directory to search] [options] [expression]
Всё, что в квадратных скобках, указывать необязательно. А значит, выполнить команду find можно вообще без опций и параметров. Она выдаст список всех файлов и папок в текущем расположении. Мало полезного, да?
Так что давайте взглянем на параметры подробнее:
- directory to search (папка поиска) — это расположение, с которого вы хотите начать поиск. Поиск по умолчанию рекурсивный и начинается с текущего расположения.
- options (опции) содержит указание типа поиска: по имени, типу файла, времени изменения и так далее — тут может быть более 50 вариантов.
- expression (выражение) содержит поисковый запрос. Если вы ищете файл по имени, параметр expression должен содержать имя файла. Если ищете файлы с именем, соответствующим заданному шаблону, поисковое выражение — это шаблон.
Простой пример:
find . -type f -name myfile
Команда выполнит поиск файла (именно файла, не папки) с именем myfile в текущей папке и подпапках. Опция -type f сужает поиск до файлов. Точка (.) указывает на текущую папку.
Поиск файлов и папок по имени
Так выполняется поиск файлов и папок по имени:
find . -name SEARCH_NAME
Поскольку тип объекта не указан, команда выполняет поиск и файлов и папок.
Пример ниже — поиск файлов и папок с именем «mystuff»:
panteleev@hp:~/Examples$ find -name mystuff ./new/mystuff ./mystuff
Поиск только файлов или только папок
Если нужно искать только файлы, на помощь придёт опция type -f:
find . -type f -name SEARCH_NAME
Тип и имя можно указывать в любом порядке. Возьмём команду выше и ограничим поиск только по файлам:
panteleev@hp:~/Examples$ find -type f -name mystuff ./mystuff
Если нужно найти папку, необходимо указать тип type -d:
find . -type d -name SEARCH_NAME
Вот пример поиска уже по папкам:
panteleev@hp:~/Examples$ find -type d -name mystuff ./new/mystuff
Поиск без учёта регистра
Команда find по умолчанию учитывает регистр. Чтобы выполнить поиск по имени файла без учёта регистра, необходимо использовать опцию -iname вместо -name.
find . -type f -iname SEARCH_NAME
С поиском по папкам (type -d) это тоже работает.
panteleev@hp:~/Examples$ find -iname mystuff ./new/mystuff ./MyStuff ./mystuff
Поиск файлов по расширению
Одно из самых популярных применений команды find — поиск файлов определённого типа, то есть по заданному расширению.
Скажем, нужно найти все файлы PHP в текущих папках, у них расширение .php::
find . -type f -name "*.php"
С такими опциями команда find найдёт только файлы (-type f) с именами, оканчивающимися на .php.
panteleev@hp:~$ find . -type f -name "*.php" ./file.php ./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream2/zstream_test.php ./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/test.php ./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/zfstream.php
При работе с командой find всегда заключайте поисковое выражение в двойные кавычки.
Рекомендация заключать поисковый запрос в двойные или одинарные кавычки! Дело в том, что без кавычек оболочка будет работать с символом * как с джокером и выполнит подстановку.
Оболочка распознает подстановочный знак * и заменит его всеми файлами в текущей папке, чьи имена заканчиваются на .php.
Это сработает, если такой файл всего один, но если их несколько, оболочка пожалуется на некорректный синтаксис.
Поиск нескольких файлов с несколькими расширениями (или условием)
Команда выше, нужна для поиска файлов по расширению. А что если нужно найти файлы с несколькими разными расширениями?
Вместо того чтобы прогонять команду find несколько раз, введите её один раз с опцией -o, которая работает как логическое условие «или»:
find . -type f -name "*.php" -o -name "*.txt"
Например:
panteleev@hp:~/Examples$ find . -type f -name "*.txt" -o -name "*.php" ./new.txt ./file.php ./new/new.txt ./new/dir2/another.txt ./new/dir1/new.txt ./another.txt
Поиск файлов в заданной папке
Все приведённые примеры иллюстрируют поиск в текущей папке, потому что команда включает в себя точку (.).
Чтобы выполнить поиск в заданной папке, не покидая текущего расположения, можно заменить точку абсолютным или относительным путём к нужной папке.
panteleev@hp:~/Examples$ find ./new -name mystuff ./new/mystuff
Поиск файлов в нескольких папках
Если нужные вам файлы могут находиться в нескольких папках, можно выполнить поиск во всех этих расположениях за один раз. Просто укажите все пути к папкам при введении команды find:
find ./location1 /second/location -type f -name "pattern"
Поиск пустых файлов и папок
Опция -empty позволяет использовать команду find для поиска пустых файлов и папок.
Найти таковые в текущей папке можно следующим образом:
find . -empty
Можно указать тип объектов, чтобы искать только файлы или только папки:
find . -empty -type f
Кроме того, можно в таком режиме искать файлы по имени:
find . -empty -type f -name "*.php"