Команда findявляется одним из самых мощных инструментов в арсенале системных администраторов Linux. Он ищет файлы и каталоги в иерархии каталогов на основе заданного пользователем выражения и может выполнять указанное пользователем действие над каждым совпадающим файлом.

Вы можете использовать findкоманду для поиска файлов и каталогов на основе их разрешений, типа, даты, владельца, размера и т. д. Его также можно комбинировать с другими инструментами, такими как grep или sed .

В этой статье вы узнаете о том, как найти файлы и каталоги в Linux.

Синтаксис команды

Общий синтаксис findкоманды следующий:

find [options] [path...] [expression]
  • Атрибут optionsуправляет обработкой символических ссылок, параметрами отладки и методом оптимизации.
  • Атрибут path...определяет начальный каталог или каталоги, в которых find будет искать файлы.
  • Атрибут expressionсостоит из параметров, шаблонов поиска и действий, разделенных операторами.

Для поиска файлов в каталоге пользователь, вызывающий findкоманду, должен иметь права на чтение этого каталога.

find -L /var/www -name "*.js"
  • Опция -L(опции) указывает findкоманде переходить по символическим ссылкам.
  • ( Путь /var/www…) указывает каталог, в котором будет выполняться поиск.
  • (Выражение) -name "*.jsуказывает findна поиск файлов, оканчивающихся на .js(файлы JavaScript).

Найти файлы по имени

Поиск файлов по имени, вероятно, является наиболее распространенным использованием findкоманды. Чтобы найти файл по его имени, используйте -nameпараметр, за которым следует имя файла, который вы ищете.

Например, чтобы найти файл с именем file.docx в /home/www-phpкаталоге, вы должны использовать следующую команду:

find /home/www-php -type f -name file.docx

Чтобы запустить поиск без учета регистра, измените -nameпараметр на -iname:

find /home/www-php -type f -iname file.docx

Найти файлы по расширению

Поиск файлов по расширению аналогичен поиску файлов по имени. Например, чтобы найти все файлы, оканчивающиеся на .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-php -type d -exec chmod 0755 {} \;
find /var/www-php -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также может искать файлы на основе их последней модификации, доступа или времени изменения.

Как и при поиске по размеру, используйте символы «плюс» и «минус» для «больше» или «меньше».

Допустим, несколько дней назад вы изменили один из конфигурационных файлов голубятни, но забыли какой именно. Вы можете легко отфильтровать все файлы в /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.

Например, чтобы найти все файлы и каталоги, принадлежащие пользователю www-php, вы должны запустить:

find / -user www-php

Вот реальный пример. Допустим, вы хотите найти все файлы, принадлежащие пользователю, 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