Поиск файлов в Unix
Ниже приведены основные параметры команды find. Используйте man find, если вам нужно описание всех параметров команды.
find dirname options
dirname – каталога, где искать
options – набор опций поиска
Опция -name задает имя искомого файла или каталога. Так же можно использовать маски. * – означает любой набор символов, ? – один любой символ, [] – набор искомых символов
find /home -name .ss?
Так можно найти все файлы в каталоги /home с названием .ss и еще одним любым символом.
find /home -name "ivan*"
find найдет все файлы и каталоги начинающиеся на ivan. Для поиска по владеющей группе есть опция -group. Нужно отметить опции -nogroup -nouser, при их использовании find будет искать файлы или каталоги с несуществующим владельцем или группой, т.е. такого логина нет в /etc/passwd или группы нет в /etc/group.
find /var/log/ -name messages.[3-7].gz
Найдет все файлы messages.n.gz, где n будет между 3 и 7
Нужно помнить, что имена файлов зависят от регистра. Для поиска по именам фалов без учета регистра нужно использовать -iname
Одна из самых полезных опций -type, которая определяет тип файлов для поиска. Наиболее используемые: d – каталок; l – ссылки; f – обычный файл.
find /home/ -type d
Таким образом будут найдены все каталоги внутри /home.
Наиболее часто используемая опция для ротации каких-то файлов -mtime, которая позволяет искать файлы по их дате модификации. В качестве параметра передается число n. Число n – это время в часах, помноженное на 24. Например, если указать -mtime 10, то будут найдены файлы, измененные 10 дней назад. Важные модификаторы +/-. Если указать критерий поиска вот так, -mtime +10, которые не изменились за последние 10 дней. И наоборот, -mtime -10 будет искать файлы, которые изменялись в течение 10 дней. Кроме -mtime есть еще -ctime и -atime, а так же -amin, -cmin, -mmin. Нужно помнить, что BCD find отличается от GNU find. В общем они работают одинаково, но есть нюансы, в том числе при работе со временем, так что man find в любом случае посмотреть будет очень полезно.
find /tmp -mtime +5
Найдет все файлы, с датой модификации старше пяти дней.
Дополнительная опция -daystart задает время отсчета от начала текущих суток.
Для поиска по размеру предусмотрена опция -size, для нее есть несколько суффиксов, все их можно посмотреть в руководстве, суффикс с — указывает размер в байтах.
find /home -size +10000000c
Найдет все файлы в каталоге /home больше 10 мегабайт
Еще одна полезная возможность реализована опциями -user и -group, с помощью которых можно искать по владельцу или группе файла.
find /tmp -user ivan
Будут найдены все файлы в каталоге /tmp, принадлежащие пользователю ivan
Для инверсии результата используется символ !, нужно помнить об его экранировании.
find /tmp ! -user ivan
В таком варианте будут показаны все файлы, кроме принадлежащих ivan.
Настоящую черную магию утилиты find содержит опция -exec. При ее помощи после нахождения файла может быть выполнена другая команда, которой передается путь до найденного файла. При совмещении ее с другими опциями одна строчка find может заменить достаточно сложный скрипт. Допустим, вы хотите удалять старые сессии в каталоге /tmp, которые остаются после работы mod_php вашего любимого web сервера apache:
find /tmp -type f -daystart -mtime +3 -user nobody -exec rm -f {} ;
Такая конструкция найдет все файлы в каталоге /tmp старше трех дней, отсчитывая время от начала текущего дня, принадлежащих пользователю nobody, после чего будет выполнена команда rf -f для каждого из найденных файлов. Или другой пример, нужный для поиска какого-то блока кода:
find /www -type f -iname "*.php" -exec fgrep "Hello world" {} ;
В этом случае будут найдены все php файлы в каталоге /www, в каждом из них fgrep будет искать строчку «Hello world».
Опция -exec считает командой строчку после себя и до символа ;, чтобы интерпретатор не воспринял его, как разделитель между командой find и какой-то еще следующей командой нужно ; экранировать. Путь до найденного файла содержится в конструкции {}.
Иногда вложенность каталогов бывает очень большой, а искать нужно только в определенном уровне вложенности. Чтобы сократить время поиска можно задать максимальный (-maxdepth) и минимальный (-mindepth) уровни.
find /usr/local/ -maxdepth 1 -type d
Будут найдены только каталоги внутри /usr/local, find не будет искать далее в подкаталогах.
find может искать файлы на основании прав на них, что бывает крайне полезно, для этого используется опция -perm:
find /www -type f -perm 755
Вот там будут найдены все файлы внутри каталога /www, у которых установлены права 755. Для -perm не обязательно указывать точные прав, а только какую-то часть. Для этого используются префиксы + и-. При использовании – будет искаться точное соответствие установленным битам, т.е. например:
find /www f -perm -005
Такой find будет искать файлы с правами 5 для остальных пользователей
find /www f -perm -055
А в этом случае find найдет фалы, у которых установлены права 5 и для группы и для всех остальных. В противовес – префикс + срабатывает для любой комбинации бит в правах:
find /www f -perm +055
find найдет все файлы с правами 5 у группы и у остальных, а так же с правами 5 у группы или у остальных.
find /www f -perm -4000
Проверяем, а нет ли у нас файлов setuid в /www.