Команда find : хитрости, секреты, трюки…

Как можно искать в linux

Существует множество различных программ для поиска, но в этом описании я остановлюсь только на двух стандартных программах, которые гарантированно есть в вашем дистрибутиве — find и locate.

FIND
Если вы знакомы с иностранными языками, то такое название для программы поиска совсем не должно вас удивлять. Это удобная программа, которая умеет искать файлы и каталоги, просматривать все каталоги в системе или только заданный, искать файлы на заданную глубину и файлы с указанными атрибутами. Что тут можно ещё добавить? Команда find имеет множество доступных параметров. Всё это можно почитать, введя команду man find в терминале. Обработка параметров, переданных команде производиться последовательно: с лева на право. Об этом нюансе немного позже.

Теперь немного примеров:

find /home -user superuser

Эта команда выплюнет на экран список абсолютных путей для всех файлов в директории /home, которые принадлежат пользователю с именем superuser.

Просто? Даже слишком.
Давайте грянем!

find . -name «[A-Z]*.php» -mtime +30 -perm 665 -user brainfucker

Так себе грянули, но пример усложнился.
Теперь по порядку:
. — ссылается на текущий каталог. Иными словами, искать мы будем в текущем каталоге.
-name «[A-Z]*.php» — найти все файлы, имя которых начинается с заглавной буквы латинского алфавита ([A-Z]) и заканчивается на .php
-mtime +30 Искать файлы, которые были изменены более чем 30 дней назад. Здесь речь идёт именно о времени последних изменений. Ещё можно проверять, например, дату последнего чтения параметром atime. Подробнее смотрите в справочной странице.
-perm 665 Искать файлы, на которые установлены права доступа 665.
-user brainfucker Это уже знакомый параметр поиска по имени владельца файла.
Под спойлером постарался разжевать выражение «[A-Z]*.php»:
Показать

Отлично! Теперь вы можете искать файлы очень гибко варьируя условия для поиска. А что делать дальше, спросите вы? Использовать параметр -exec, невозметимо отвечу я! Этот параметр передаст список файлов указанной программе.
Например:

find /home -user superuser -exec chmod 777

найдёт файлы пользователя superuser и установит на них права доступа 777 (chmod 777). Бывает так, что длина командной строки может быть ограничена, поэтому, если файлов слишком много, система выдаст ошибку. Тогда для дальнейшей обработки файлов используют передачу stdout программы find (собственно, список файлов) программе xargs. Тут всё аналогично. Только форма записи немного отлична:

find . -perm 777 | xargs rm
такая строка, будучи запущенной на исполнение, удалит все файлы с правами доступа 777 в текущей директории.

Будьте осторожны!
find обрабатывает параметры, переданные ей, последовательно. Так, если вы захотите удалить из некоторого каталога файлы, по очень точно подобранным параметрам, то опцию -delete нужно указать после всех других параметров. Ещё 2 примера:

find / -name «[A-Z]*» -mtime +30 -perm 665 -user brainfucker -delete

В этом случае я удалю все файлы в системе, имена которых начинаются с заглавной буквы, которые были изменены более 30 дней назад, на которые установлены права доступа 665 и при всём этом принадлежащие юзеру brainfucker. Всё правильно.

find / -delete -name «[A-Z]*» -mtime +30 -perm 665 -user brainfucker

В этом случае я удалю всё. Вообще всё. Почему? Команда find, которой в качестве параметра передан каталог, «найдет» вообще все файлы в этом каталоге. В данном случае, список файлов из каталога / будет передан на удаление, без применения всех остальных фильтров.

LOCATE
Locate простой. Его основное (и единственное?) преимущество — скорость. Find перебирает все файлы в указанном каталоге и просматривает их на соответствие параметрам. Locate зараннее знает где что у вас есть. Для этого раз в сутки (если не настроено иначе), обновляется специальная база данных, с которой locate работает.

Locate возвращает все файлы, в имени или названии каталога которого есть искомая строка.

$locate xauth
/home/mj/.xauth
/home/mj/.xauth/refcount
/home/mj/.xauth/refcount/root
/home/mj7 .xauth/refcount/root/testlinux
/lib/security/pam_xauth.so
/usr/XllR6/bin/mkxauth
/usr/XllR6/bin/xauth
/usr/XllR6/man/manl/mkxauth.1x.gz
/usr/XllR6/man/manl/xauth.1x.gz
/usr/share/doc/pam-0.72/txts/README.pam_xauth
/usr/share/man/man8/pam_xauth.8.gz

Как видите, результатом работы команды является список абсолютных путей, которые таки или иначе включают в себя подстроку xauth.

Ещё, наверное, нужно сказать что базу данных locate можно обновить принудительно командой updatedb (нужны права суперпользователя). Если вы не можете найти необходимый файл, попробуйте обновить базу данных.

Взято отсюда>>>

Смотрите также:  Список полезных команд linux,  Пополняемая статейка – сборник коротких, но полезных рецептов для linux.