Поиск файлов в linux: find

Задача поиска определенных файлов или каталогов достаточно часто встречается в работе Unix-администратора. Начинающие администраторы решают ее странными и малоэффективными способами, например я в первые дни своего знакомства с linux использовал ls с ключом рекурсивного просмотра каталогов и потом натравливал grep на вывод ls. Согласитесь, выглядит достаточно дико.


А между тем в любом дистрибутиве есть утилита find – очень мощный и гибкий инструмент поиска. Возможности ее воистину огромны, как и огромен список доступных опций. Потому не буду касаться их всех, расскажу только о самых востребованных с моей точки зрения.
Часто хорошее знание find позволяет сэкономить массу времени, так как правильно выбранная команда find может заменить собой небольшой скрипт, а иногда просто незаменима. Для работы с find не требуется запоминать что-то особенное, так как и сам синтаксис find очень простой, а названия опций знакомы любому unix-администратору:

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.

В заключение хочу сказать и об отрицательной стороне использования find. После некоторого времени активного использования find к ней очень сильно привыкаешь, а когда приходится искать что-то в окошках, чувствуешь себя крайне неуютно без уже такого привычного find.


Tags:

Понедельник, Сентябрь 21st, 2009 Статьи
Cheap Retro Replica NFL NBA MLB Throwback Football Basketball Jerseys | hp printer ink cartridges refills| Jewelry Making Supplies | Thumb Joint Pain | Dog Health Problems |Tinkerbell Personal Checks |Garden Planters