Введение
Команда find
— один из самых мощных инструментов в арсенале системного администратора Linux. Поиск файлов и папок (каталогов) в иерархии каталогов на основе выражения, заданного пользователем, и может выполнять указанные пользователем действия над каждым соответствующим файлом.
Вы можете использовать команду find
для поиска файлов и каталогов на основе разрешений, типа, даты, владельца, размера и т. д. Его также можно использовать в сочетании с другими инструментами, такими как grep
или sed
.
Найти синтаксис команды
Общий синтаксис команды find
следующий:
find [options] [path...] [expression]
- Атрибут
options
управляет обработкой символических ссылок, опциями отладки и методом оптимизации. - Атрибут
path...
определяет начальный каталог или каталоги, в которых find будет искать файлы. - Атрибут
expression
состоит из параметров, шаблонов поиска и действий, разделенных операторами.
Для поиска файлов в каталоге пользователь, вызывающий команду find
, должен иметь права на чтение для этого каталога.
Давайте посмотрим на следующий пример:
find -L /var/www -name "*.js"
- Параметр
-L
(options
) указывает командеfind
следовать символическим ссылкам. /var/www
(path...
) указывает каталог, который будет искаться.expression
-name "*.js
указывает командеfind
искать файлы, оканчивающиеся на.js
(файлы JavaScript).
Найти файлы по имени
Поиск файлов по имени, вероятно, является наиболее распространенным применением команды find
. Чтобы найти файл, используя его имя, за параметром -name
следует имя файла, который вы ищете.
Например, для поиска файла с именем document.pdf
в каталоге /home/noviello
нужно использовать следующую команду:
find /home/noviello -type f -name document.pdf
Чтобы выполнить поиск без учета регистра, замените параметр -name
на -iname
:
find /home/noviello -type f -iname document.pdf
Приведенная выше команда будет соответствовать «Document.pdf», «DOCUMENT.pdf» и т. д.
Поиск файлов по расширению
Поиск файлов по расширению аналогичен поиску файлов по имени. Например, чтобы найти все файлы, заканчивающиеся на .log.gz
внутри каталога /var/log/nginx
, вы можете использовать:
find /var/log/nginx -type f -name '*.log.gz'
Важно помнить, что при использовании подстановочного знака вы должны заключать шаблон в кавычки или экранировать символ звездочки *
обратной косой чертой \
, чтобы он не интерпретировался оболочкой.
Чтобы найти все файлы, не соответствующие регулярному выражению *.log.gz
, вы можете использовать параметр -not
. Например, чтобы найти все файлы, которые не заканчиваются на *.log.gz
, вы должны использовать:
find /var/log/nginx -type f -not -name '*.log.gz'
Поиск файлов по типу
Иногда вам может понадобиться искать определенные типы файлов, такие как обычные файлы, каталоги или символические ссылки. В Linux все является файлом.
Для поиска файлов по их типу используйте параметр -type
и один из следующих дескрипторов для указания типа файла:
f
: обычный файлd
: каталогl
: символическая ссылкаc
: символьные устройстваb
: запорные устройстваp
: именованный канал (FIFO)s
: сокет
Например, чтобы найти все каталоги в текущем рабочем каталоге, используйте:
find. -type d
Типичным примером может быть рекурсивное изменение прав доступа к файлу веб-сайта на 644
и разрешений каталога на 755
с помощью команды chmod
:
find /var/www/my_website -type d -exec chmod 0755 {} \;
find /var/www/my_website -type f -exec chmod 0644 {} \;
Поиск файлов по размеру
Чтобы найти файлы по размеру, передайте параметр -size
вместе с критериями размера. Для указания размера файла можно использовать следующие суффиксы:
b
: блоки по 512 байт (по умолчанию)c
: байтw
: двухбайтовые словаk
: килобайтM
: МегабайтыG
: Гигабайт
Следующая команда найдет все файлы размером ровно 1024
байта в каталоге /tmp
:
find /tmp -type f -size 1024c
Команда find
также позволяет искать файлы большего или меньшего размера, чем указанный размер.
В следующем примере мы ищем все файлы размером менее 1MB
в текущем рабочем каталоге. Обратите внимание на знак минус перед значением размера -
find. -type f -size -1M
Если вы хотите найти файлы размером более 1MB
, вам нужно использовать символ плюс +
:
find. -type f -size +1M
Вы также можете искать файлы в диапазоне размеров. Следующая команда найдет все файлы размером от 1
до 2MB
:
find. -type f -size +1M -size 21M
Поиск файлов по дате модификации
Команда find
также может искать файлы по времени последней модификации, времени доступа или модификации.
Как и при поиске по измерению, используйте символы «плюс» и «минус» для «больше» или «меньше».
Допустим, вы изменили один из файлов конфигурации dovecot несколько дней назад, но забыли, какой именно. Вы можете легко отфильтровать все файлы в каталоге /etc/dovecot/conf.d
оканчивающиеся на .conf
и измененные за последние пять дней, с помощью:
find /etc/dovecot/conf.d -name "*.conf" -mtime 5
Вот еще один пример фильтрации файлов по дате изменения с помощью параметра -daystart
. Следующая команда выведет список всех файлов в каталоге /home
, которые были изменены более 30
дней назад:
find /home -mtime +30 -daystart
Найти файлы по разрешениям
Опция -perm
позволяет искать файлы на основе прав доступа к файлам.
Например, чтобы найти все файлы с ровно 775
разрешениями в каталоге /var/www/html
, вам нужно будет использовать:
find /var/www/html -perm 644
Вы можете добавить префикс к числовому режиму с минусом /
-
Когда косая черта /
используется в качестве префикса, по крайней мере одна категория (пользователь, группа или другие) должна иметь по крайней мере соответствующие биты, установленные для соответствия файла.
Рассмотрим следующий пример команды:
find. -perm /444
Приведенная выше команда будет сопоставлять все файлы с разрешениями на чтение, установленными пользователем, группой или другими пользователями.
Если вы используете меньше -
в качестве префикса, вы должны установить файл так, чтобы он соответствовал хотя бы указанным битам. Следующая команда будет искать файлы, которые имеют права на чтение и запись для владельца и группы и доступны для чтения другим пользователям:
find. -perm -664
Поиск файлов по владельцу
Чтобы найти файлы, принадлежащие определенному пользователю или группе, используйте параметры -user
и -group
.
Например, чтобы найти все файлы и каталоги, принадлежащие пользователю noviello
, выполните:
find /-user noviello
Допустим, вы хотите найти все файлы, принадлежащие пользователю www-data
и изменить владельца соответствующих файлов с www-data
на nginx
:
find /-user www-data -type f -exec chown nginx {} \;
Найти и удалить файлы
Чтобы удалить все совпадающие файлы, добавьте параметр -delete
в конец выражения соответствия.
Убедитесь, что вы используете эту опцию только тогда, когда уверены, что результат соответствует файлам, которые вы хотите удалить. Всегда полезно распечатать соответствующие файлы перед использованием опции -delete
.
Например, чтобы удалить все файлы, оканчивающиеся на .temp
из каталога /var/log/
, вы должны использовать:
find /var/log/-name `*.temp` -delete
Используйте параметр -delete
с особой осторожностью. Командная строка поиска оценивается как выражение, и если вы сначала добавите параметр -delete
, команда удалит все ниже указанных начальных точек.
Когда дело доходит до каталогов, вы можете удалить только пустые каталоги, такие как rmdir
, с помощью команды find
.
Вывод
Мы показали вам, как использовать команду find
с различными параметрами и критериями.
Эта статья должна дать вам общее представление о том, как найти файлы в ваших системах Linux. Вы также можете посетить справочную страницу поиска, find
прочитать обо всех других мощных опциях.