
Команда find — один из самых мощных инструментов в арсенале системных администраторов Linux. Она ищет файлы и каталоги в иерархии каталогов по заданному пользователем выражению и может выполнять заданные пользователем действия над каждым найденным файлом.
Команду find можно использовать для поиска файлов и каталогов по их правам доступа, типу, дате, владельцу, размеру и другим параметрам. Её также можно комбинировать с другими инструментами, такими как grep или sed .
find Синтаксис команды
Общий синтаксис команды 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 , а затем имя искомого файла.
Например, чтобы найти файл с именем document.pdf в каталоге /home/linuxize , используйте следующую команду:
find /home/linuxize -type f -name document.pdf
Чтобы выполнить поиск без учета регистра, измените опцию -name на -iname :
find /home/linuxize -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 .
Например, чтобы найти все файлы и каталоги, принадлежащие пользователю linuxize , выполните:
find / -user linuxize
Вот реальный пример. Допустим, вы хотите найти все файлы, владельцем которых является пользователь 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 с особой осторожностью. Команда find обрабатывается как выражение, и если вы сначала добавите опцию -delete , команда удалит всё, что находится ниже указанных вами начальных точек.
Что касается каталогов, find может удалять только пустые каталоги, так же как rmdir .
Заключение
Мы показали вам, как использовать команду find с различными параметрами и критериями.
Эта статья даст вам базовые знания о поиске файлов в системах Linux. Вы также можете посетить страницу руководства find и узнать о других полезных возможностях команды find .
Если у вас есть вопросы или замечания, пожалуйста, оставьте комментарий ниже.
Связанные руководства