(495) 514-86-94

Поиск файлов в 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.

источник

Вход в личный кабинет