Главная > Archive ITword, В помощь sysadmin'y > Find, или поиск в Linux.

Find, или поиск в Linux.

Сразу хочу заметить что существует множество разных способов для реализации поиска в Linux. Сейчас, например очень сильно развивается проект beagle. Но я буду говорить о стандартных методах поиска в Linux и Unix. А именно я хочу описать пользование набором программ findutils.

Из набора программ, содержащихся в этом пакете, нас будет интересовать только find и xargs.
Начнем с find. Команда find представляет собой универсальный инструмент для поиска, она позволяет искать файлы и каталоги, просматривать все каталоги в системе или только заданный, искать на файлы заданную глубину и файлы с указанными атрибутами. Обычно пользователи знают что для поиска в Linux существует команда find, но использования этой команды заканчивается на двух трех известных опциях. Для эффективного же поиска, желательно изучить большинство доступных опций.

Использование:
find [-H] [-L] [-P] [путь...] [выражение]

-P — никогда не следовать символьным ссылкам. Эта опция включена по умолчанию;
-L - следовать символьным ссылкам. При этом команда find показывает информацию о файле, на который указывает данная ссылка.
-H — не следовать символьным ссылкам за исключением когда обрабатываются аргументы командной строки. Информация берется из самой ссылки

Путь по умолчанию: текущий каталог; выражение по умолчанию: -print; выражение может состоять из операторов, опций, тестов и действий:

операторы (в порядке уменьшения приоритета; -and берется по умолчанию, если не дано других):
( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2
EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2

опции, зависящие от положения (всегда верно): -daystart -follow -regextype

обычные опции:
-depth —help -maxdepth УРОВНИ -mindepth УРОВНИ -mount -noleaf
—version -xdev -ignore_readdir_race -noignore_readdir_race

тесты: (N могут быть +N или -N или N): -amin N -anewer ФАЙЛ -atime N -cmin N
-cnewer ФАЙЛ -ctime N -empty -false -fstype ТИП -gid N -group ИМЯ
-ilname ШАБЛОН -iname ШАБЛОН -inum N -ipath ШАБЛОН -iregex ШАБЛОН
-links N -lname ШАБЛОН -mmin N -mtime N -name ШАБЛОН -newer ФАЙЛ
-nouser -nogroup -path ШАБЛОН -perm [+-]РЕЖИМ -regex ШАБЛОН
-wholename ШАБЛОН -size N[bcwkMG] -true -type [bcdpflsD] -uid N
-used N -user ИМЯ -xtype [bcdpfls]

действия: -delete -print0 -printf ФОРМАТ -fprintf ФАЙЛ ФОРМАТ -print
-fprint0 ФАЙЛ -fprint ФАЙЛ -ls -fls ФАЙЛ -prune -quit
-exec КОМАНДА ; -exec КОМАНДА {} + -ok КОМАНДА ;
-execdir КОМАНДА ; -execdir КОМАНДА {} + -okdir КОМАНДА ;

Опишем наиболее используемые из них:

- name - поиск файлов, имена которых соответствуют заданному шаблону;
- print — поместить запись полных имен найденных файлов в стандартный поток вывода;
- perm — поиск файлов по режиму доступа;
- user — поиск файлов принадлежащих данному пользователю
-nouser — поиск файлов принадлежащих не существующему пользователю, т.е. которого нет в /etc/passwd;
-group — аналогично с -user, только для группы;
-nougroup — аналогично -nouser, только для несуществующей группы;
- mtime -n (+n) — поиск файлов которые модифицировались менее чем -n или более чем +n дней назад;
- atime — поиск по дате -последнего чтения;
- ctime -последнего изменения атрибутов файла;
- type — поиск указанного типа файлов. Т.е. f — обычный файл, d — каталог и т.д.;
- size n — поиск файлов размером n единиц; единицы: c — байт, k — килобайт, b -блок (в зависимости от системы);
- mount — поиск в текущей файловой системе;
- exec — выполнение команды shell для найденных файлов.

Примеры использования команды find:
$ find /home -user serhiy
Найти все файлы в директории /home и всех поддиректориях принадлежащие пользователю serhiy

$ find ~ -name *.c
В вашей домашней директории найдет все файлы с расширением .с. Например helloworld.c

$ find . -name "[A-Z]*"
В текущем каталоге и его подкаталогах найдет файлы начинающиеся с большой буквы. Заметте что выражение для поиска задано в «…».
Для поиска файлов, которые вы не модифицировали какое-то время, используйте ключ «-mtime», а для файлов, у которых определенное время назад не менялись права доступа, используйте «-ctime». Число после символа «+» задает количество дней (суток). Для того, чтобы узнать какие файлы были модифицированы сегодня, попробуйте:
find . -mtime -1 -print
Эта команда покажет вам, какие файлы были модифицированы за последние сутки. Заметьте, что для указания времени «меньше чем» следует указать знак «-».
$ find /var/www/ -mtime -10
Найти файлы в каталоге /var/www/ и его подкаталогах которые были изменены менее чем 10 дней назад.
$ find /var/www/ -mtime +30 -name "*.php"
Найти все .php файлы в каталоге /var/www/ и его подкаталогах которые были изменены более чем 30 дней назад.
найдем файлы, которые не читали более чем (условие «более чем» задается знаком «+») 30 дней:
find . -atime +30 -print
$ find . -perm 777
Найти все файлы в текущем каталоге, которые имеют права доступа 777.

Я думаю, поняв эти примеры, Вы сможете легко найти нужные вам файлы в Linux. Следующим шагом будет совместное использование find и xargs.

Выше я уже упоминал о опции -exec. С помощью этой опции команда find передает указанному интерпритатору shell все найденный файлы для исполнения, которые обрабатываются один раз. Но могут быть трудности с тем, что длина командной строки может быть ограничена, поэтому если файлов слишком много, система выдаст ошибку. Команда xargs как раз решает эту проблему. Дело в том, что эта команда обрабатывает файлы полученные от find не сразу все, как -exec, а порциями.
Рассмотрим некоторые примеры использования find c xargs:
$ find . -perm 777 | xargs rm
Команда find находит в данном каталоге файлы с атрибутами 777, и команда rm удаляет их.

Или скажем вы хотите найти в домашнем каталоге файл name.c и изменить его права доступа на 777:
$ find ~ -name name.c | xargs chmod 777
И еще один пример поиск в файлах:
$ grep -ri '???' *,
где ‘???’ — искомое значения

Немного дополним статью подсмотренно в Журнале «Системный администратор»

Если вы запустите эту команду от имени непривилегированного пользователя в системном каталоге, то наверняка получите массу сообщений типа:
$ find: ./backup/pgsql: Permission denied
Избавиться от них поможет следующий приём:
$ find ./ -name "milter-spa*" 2>/dev/null
То есть сообщения об ошибках (2 – это дескриптор потока STDERR) мы просто выкидываем, оставляя лишь нормальный вывод STDOUT.
Так же вы можете также удалять файлы, соответствующие критериям поиска или даже применять к ним любую произвольную команду. В этом и заключается мощь утилиты find.
$ find test -nouser -delete
Этой командой мы одним махом удалим все файлы в каталоге test, не имеющие владельца (т.е. UID которых не фигурируют в базе учётных записей). Понятно, что таким образом можно удалить и всё, найденное по критерию -name или любому другому. Будьте осторожны!
$ find ./ -name "*.py" -exec cat {} \;
А так можно вывести на экран содержимое всех скриптов на Python (если точнее, то файлов, имеющих расширение .py). Обратите внимание на непонятную конструкцию «{}» – в процессе выполнения она будет заменена результатом поиска, т.е. cat получит в качестве параметров список соответствующих файлов. Точка с запятой в конце тоже обязательна – это указание для find, что опция exec закончилась. Чтобы «;» не интерпретировалась оболочкой, не забывайте его экранировать.
При необходимости всегда можно воспользоваться богатым набором опций для поиска файлов на основании их временных атрибутов (времени модификации, доступа и т. д.).
$ find ./ -atime +90d -size +20 -exec tar cjf old.tbz2 {} \;
Этой страшной конструкцией мы упакуем в архив все файлы больше 10 килобайт (20 блоков по 512 байт; в GNU-версии утилиты можно указывать размер и непосредственно в кило/мега/гигабайтах), к которым никто не обращался более трёх месяцев.
Критерии поиска могут быть самыми разнообразными – по типу файла (каталог, символическая ссылка, регулярный файл и т. д.), по владельцу и группе (опции -user и -group), по выставленным на файле флагам и правам доступа (-flags и -perm соответственно). Для поиска без учёта регистра символов используйте -iname, в более сложных случаях к вашим услугам опция -regex. Можно даже учитывать тип файловой системы (например, при выполнении какого-то действия не принимать во внимание файлы, доступные через NFS).
Утилита find обладает развитым языком составления выражений, когда различные критерии поиска можно группировать с использованием логических операций (разбор оставлю вам в качестве упражнения):
$ find ./ -iname 'qwe*' -and -size +20 -or -name 'Qwert'
Показанным выше возможности find не исчерпываются – это всего лишь несколько примеров из возможных. Не поленитесь прочитать справку (man find), особенно обращая внимания на приведённые там примеры. И жить в консоли сразу станет проще, жить станет веселей.

  1. Пока что нет комментариев.
  1. Пока что нет уведомлений.
Необходимо войти на сайт, чтобы написать комментарий.
#

//