HPUNIX Сайт о ОС и не только!

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

13 августа 2008 - unix

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

А непосредственно я желаю описать внедрение набором программ findutils.

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

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

Внедрение:
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

Linux Video Man Pages - find

обыденные функции:
-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 дней назад;

Find, либо поиск в Linux
- atime — поиск по дате -последнего чтения;
- ctime -последнего конфигурации атрибутов файла;
- type — поиск обозначенного типа файлов. Т.е. f — обыденный файл, d — каталог и т.д.;
- size n — поиск файлов размером n единиц; единицы: c — б, k — кб, b -блок (зависимо от системы);
- mount — поиск в текущей файловой системе;
Find, либо поиск в Linux
- 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 Семьсот 70 семь | xargs rm

Pinterest Automation Demo - Keyword search and like pins on Linux (QT)

Команда 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 блоков по 500 двенадцать б; в GNU-версии утилиты можно указывать размер и непосредственно в кило/мега/гб), к которым никто не обращался более трёх месяцев.
Нюансы поиска могут быть самыми разными – по типу файла (каталог, символическая ссылка, неизменный файл и т. д.), по владельцу и группе (функции -user и -group), по выставленным на файле флагам и правам доступа (-flags и -perm соответственно). Для поиска без учёта регистра символов используйте -iname, в более сложных случаях к вашим услугам функция -regex. Можно даже учитывать тип файловой системы (например, при выполнении какого-то деяния не принимать во внимание файлы, доступные через NFS).
Утилита find обладает развитым языком составления выражений, когда различные нюансы поиска можно группировать с внедрением логических операций (разбор оставлю для вас в качестве упражнения):
$ find ./ -iname 'qwe*' -and -size +20 -or -name 'Qwert'
Показанным выше возможности find не исчерпываются – это всего только несколько примеров из возможных. Не поленитесь прочитать справку (man find), в особенности обращая внимания на приведённые там примеры. И жить в консоли слету станет проще, жить станет веселей.

Похожие статьи

  • Обзор игр в GNU Linux

    The Battle for Wesnoth — свободная пошаговая стратегия в фентезийном стиле. Довольно обычная, но жутко интересная Начинаете одним игроком с малым кол-вом золота, нанимаете армию, воюте, п...

  • find Программки и утилиты

    find — утилита поиска файлов, применяемая в UNIX?схожих операционных системах. Может создавать поиск в одной либо нескольких директориях с внедрением критериев, данных юзером. По...

  • Организации поиска данных с Beagle

    Статья написана в журнале ВзломщикОбъемы современных жестких дисков позволяют хранить колоссальное количество самой различной инфы. Хотя без определенной систематизации и наличия комфортабельной и...

  • Установка

    Представьте себе, что подходящая Для вас программа доступна только в виде .rpm пакета, а вы используете Debian или Ubuntu. Как быть в таком случае? Можно отыскать исходники и скачать, но...

  • Утилита для проверка системы на rootkit руткиты

    Не считая утилиты chkrootkit, про которую писал ранее, есть еще один подходящий пакет — rkhunter, который в купе с chkrootkit предназначен для обеспечения безопасности сервера на предмет троянов,виру...

Теги: gnu linux
Рейтинг: +19 Голосов: 220 1364 просмотра
Комментарии (0)

Нет комментариев. Ваш будет первым!

Найти на сайте: параметры поиска

Windows 7

Среда Windows 7 на первых порах кажется весьма непривычной для многих.

Windows 8

Если резюмировать все выступления Microsoft на конференции Build 2013.

Windows XP

Если Windows не может корректно завершить работу, в большинстве случаев это

Windows Vista

Если к вашему компьютеру подключено сразу несколько мониторов, и вы регулярно...