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