Find

Материал из Wiki Open book
Перейти к: навигация, поиск

Оглавление

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

find [директория ...] [параметры поиска]

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

Для того, что бы найти файл по его имени можно использовать один из трех параметров поиска:

  • -name имя файла -- поиск файла по имени. Регистр букв учитывается. В имени файла можно использовать стандартные символы подстановки *, ? и [ ].
  • –iname имя файла -- тоже самое, что и -name, только при поиске не учитывается регистр букв.
  • –regex выражение -- поиск файла по имени, в качестве дополнительного параметра используется регулярное выражение.

Для того, что бы в директории /etc найти файл с именем, заканчивающимся на allow, можно выполнить такую команду:

$ find /etc -name *.net 2> /dev/null
/etc/issue.net
/etc/auto.net
$

Программа запускалась обыкновенным пользователем системы, на экран могли выводиться сообщения об ошибках, поэтому стандартный вывод ошибки был перенаправлен в /dev/null. Поиск происходил в директории /etc и во всех поддиректориях. В результате поиска были найдены два файла. Каждый файл выводится в отдельной строке.

При помощи параметра –type можно искать файлы определенного типа:

  • f -- обыкновенные файлы.
  • d -- директории.
  • l -- символьные ссылки.
  • b -- файлы блочных устройств.
  • c -- файлы символьных устройств.
  • p -- FIFO файлы.
  • s -- файлы типа socket.

Например, что бы получить список символьных ссылок, имя которых начинается на xfree, находящихся в директории /etc/X11 можно выполнить следующую команду:

$ find /etc/X11 -type l -name xfree* 2> /dev/null
/etc/X11/xkb/rules/xfree86-it.lst
/etc/X11/xkb/rules/xfree86
/etc/X11/xkb/rules/xfree86.lst
/etc/X11/xkb/rules/xfree86.xml
$

В приведенном выше примере использовались два критерия поиска. Они объединяются логическим И. Мы искали символьные ссылки И их имя должно начинаться на xfree.

При помощи программы find можно искать файлы, принадлежащие определенному пользователю системы. Для этого следует использовать три параметра:

  • –user пользователь -- поиск файлов принадлежащих пользователю с указанной учетной записью.
  • –uid UID -- поиск файлов принадлежащих пользователю с указанным номером.
  • –nouser -- поиск файлов не принадлежащих ни одному пользователю системы.

Например, что бы в директориях /tmp и /var/tmp найти файлы, принадлежащие пользователю user1 можно использовать следующую команду:

# find /tmp /var/tmp -user user1
/tmp/mc-user1
#

Иногда в системе появляются потерявшиеся файлы. Они не принадлежать ни одному пользователю системы и появляются после удаления пользователя. Если Вы помните, при удалении пользователя информация о нем удаляется их конфигурационных файлов /etc/passwd, /etc/shadow и /etc/group. Так же удаляется его домашняя директория. Но если пользователь имел возможность создавать файлы за пределами своей домашней директории, такие файлы не будут автоматически удалены из системы. Наша задача, сделать так что бы бесхозных файлов в системе не было. Их надо либо удалять, либо передавать другим пользователям системы. Следующая команда ищет потерянные файлы (параметр –nouser) в директории /tmp.

# find /tmp -nouser
/tmp/mc-user5
#

Это все что осталось после удаления пользователя user5. Судя по всему, при жизни он любил использовать Midnight Commander.

Для работы с группами существуют аналогичные критерии поиска:

  • –grup группа -- поиск файлов принадлежащих группе с указанным именем.
  • –gid GID -- поиск файлов принадлежащих группе с указанным номером.
  • –nogroup -- поиск файлов не принадлежащих ни одной группе.

Find позволяет искать файлы по временным меткам.

  • –atime N -- поиск файла, время последнего доступа к которому равно N суток назад.
  • –amin N -- поиск файла, время последнего доступа к которому равно N минут назад.
  • –ctime N -- поиск файла, параметры которого изменились N суток назад.
  • –cmin N -- поиск файла, параметры которого изменились N минут назад.
  • –mtime N -- поиск файла, содержимое которого изменились N суток назад.
  • –mmin N -- поиск файла, содержимое которого изменились N минут назад.

Очень важно понять как определяется число N. Оно может быть без знака -- 1, отрицательным -- -1, положительным -- +1. Например, нам необходимо найти все файлы, содержимое которых было изменено за последние сутки. Для этого будем использоваться параметром –mtime. Если написать –mtime 1, будут найдены все файлы, которые были изменены ровно сутки назад. Если написать –mtime +1 (больше чем сутки назад), будут найдены все файлы которые были изменены начиная со времен Адама и Евы и до сутки назад. Если написать –mtime -1 (меньше чем), будут найдены все файлы, измененные за последние сутки.

$ find /home/artur/MyDocs -mtime -1
/home/artur/MyDocs/book/DOC/ch04
/home/artur/MyDocs/book/DOC/ch04/ch04-03.sxw
/home/artur/MyDocs/book/DOC/ch04/ch04_03.png
$

Действительно, я сейчас сижу и пишу эту книгу, а именно четвертую главу. В директорию добавил новый файл с рисунком, то есть изменил содержимое файла типа директория.

$ find /home/artur/MyDocs -ctime -1
/home/artur/MyDocs/book/DOC/ch04
/home/artur/MyDocs/book/DOC/ch04/ch04-03.sxw
/home/artur/MyDocs/book/DOC/ch04/ch04_03.png
$

Упс! А почему при использовании –ctime мы получили такие же результаты? Изменяя содержимое директории или файла, мы изменяем содержимое inode этого файла. В нашем случае изменяются указатели на блоки, в которых расположены данные. Временная метка ctime изменяется при изменении inode файла, где как раз и находятся указатели на блоки с информацией. Поэтому программа и выдает нам соответствующий список.

Сейчас я изменю права доступа к файлу с другим рисунком и снова запущу find.

$ chmod g+w /home/artur/MyDocs/book/DOC/ch04/ch04_01.png
$ find /home/artur/MyDocs -ctime -1
/home/artur/MyDocs/book/DOC/ch04
/home/artur/MyDocs/book/DOC/ch04/ch04-03.sxw
/home/artur/MyDocs/book/DOC/ch04/ch04_01.png
/home/artur/MyDocs/book/DOC/ch04/ch04_03.png
$ find /home/artur/MyDocs -mtime -1
/home/artur/MyDocs/book/DOC/ch04
/home/artur/MyDocs/book/DOC/ch04/ch04-03.sxw
/home/artur/MyDocs/book/DOC/ch04/ch04_03.png
$

Информация в файле не была изменена, но поменялись права доступа. Поэтому find с параметром –ctime обнаружила файл ch04_01.png, а параметр –mtime на этот файл не среагировал.

И еще один эксперимент, изменим время последнего доступа к файлу и посмотрим как на это прореагирует find.

$ touch -a /home/artur/MyDocs/book/DOC/ch04/ch04_02.png
$ find /home/artur/MyDocs -mtime -1
/home/artur/MyDocs/book/DOC/ch04
/home/artur/MyDocs/book/DOC/ch04/ch04-03.sxw
/home/artur/MyDocs/book/DOC/ch04/ch04_03.png
$ find /home/artur/MyDocs -ctime -1
/home/artur/MyDocs/book/DOC/ch04
/home/artur/MyDocs/book/DOC/ch04/ch04-03.sxw
/home/artur/MyDocs/book/DOC/ch04/ch04_01.png
/home/artur/MyDocs/book/DOC/ch04/ch04_02.png
/home/artur/MyDocs/book/DOC/ch04/ch04_03.png
$

Содержимое файла не было изменено, поэтому –mtime опять пропустило этот файл. Но была изменена временная метка, а она находится в inode файла, поэтому –ctime такой файл обнаружила.

Теперь открою файл ch04-02.sxw в редакторе, ничего с ним делать не буду и сразу закрою программу.

$ find /home/artur/MyDocs -ctime -1
/home/artur/MyDocs/book/DOC/ch04
/home/artur/MyDocs/book/DOC/ch04/ch04-03.sxw
/home/artur/MyDocs/book/DOC/ch04/ch04_01.png
/home/artur/MyDocs/book/DOC/ch04/ch04_02.png
/home/artur/MyDocs/book/DOC/ch04/ch04_03.png
$

Find -ctime -1 -- это не обнаружил, значит при открытии файла в редакторе почему то не менялась временная метка последнего времени доступа. Проверим.

$ find /home/artur/MyDocs -atime -1 | grep \.sxw
/home/artur/MyDocs/book/DOC/ch04/ch04-02.sxw
/home/artur/MyDocs/book/DOC/ch04/ch04-03.sxw
$

Однако метка поменялась и find -atime -1 это обнаружил. Тогда почему не сработала –ctime? Незнаю, возможно это особенность программы, а может быть и глюк.

Find может искать файлы по их размеру. Для этого используют параметр –size. В качестве дополнительного аргумента можно указать число, как положительное, так и отрицательное, определяющее размер файла. Например, необходимо найти все файлы, размер которых превышает 100 Мбайт.

$ find /home/artur -size +100M
/home/artur/vmware/Slackware/564dcdc1-4ae1-69bb-eac6-039fb1f1fa1e.vmem
/home/artur/vmware/Slackware/Slackware-0-f001.vmdk
/home/artur/vmware/Slackware/Slackware-0-f002.vmdk
$ ls -l /home/artur/vmware/Slackware/Slackware-0-f001.vmdk
-rw-------  1 artur users 2147221504 2005-08-31 14:46 /home/artur/vmware/Slackware/Slackware-0-f001.vmdk
$

При работе с find следует обратить внимание на параметры –mount или –xdev (это синонимы). Если использовать эти параметры, то программа будет осуществлять поиск только в пределах одной физической файловой системы. Например, нам необходимо что то найти в директории /usr. Но директория /usr/local является точкой монтирования другой файловой системы. Если запустить поиск без указания параметра –mount, поиск будет происходить в файловой системе в которой расположена директория /usr, а так же в файловой системе, подключенной к /usr/local. Если при вызове программы указать параметр –mount, то поиск в директории /usr/local производиться не будет.

Очень полезен параметр –perm, позволяющий искать файлы с определенными правами доступа. Во второй главе я уже показывал, как можно найти файлы с установленным SUID битом:

# find /usr/bin -perm +4000
/usr/bin/sudo
/usr/bin/mandb
/usr/bin/man
/usr/bin/gpg
/usr/bin/chage
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/expiry
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/lppasswd
/usr/bin/rcp
/usr/bin/rlogin
/usr/bin/rsh
/usr/bin/at
/usr/bin/crontab
/usr/bin/vmware
/usr/bin/vmware-ping
#

При указании прав доступа можно использовать как числовой, так и символьный формат. Дальше в примерах я буду использовать только числовой формат. Так же, при указании прав доступа можно использовать символы минус и плюс.

  • Знак плюс перед правами доступа говорит, что у файла могут быть установлены любые из перечисленных прав доступа.
  • Знак минус перед правами говорит о том, что у файла должны быть обязательно установлены все перечисленные права доступа, не перечисленные могут быть установлены, а могут быть и не установлены.
  • Если перед правами доступа не указано ни плюс, ни минус, тогда у файла должны быть установлены только перечисленные права доступа.

Рассмотрим пример. Есть два файла: test1 (права 1664) и test2 (права 664).

$ ls -l
итого 0
-rw-rw-r-T  1 artur users 0 2005-08-31 17:23 test1
-rw-rw-r--  1 artur users 0 2005-08-31 17:23 test2
$ find . -perm 664
./test2
$ find . -perm -664
./test1
./test2
$ find . -perm +664
.
./test1
./test2
$

При использовании –perm 664 будет найден только файл test2. Ведь только у него права доступа равны 664. Когда перед правами был поставлен минус: –perm -664, программа вывела два файла. У обоих файлов установлены права 664. Но поскольку остальные установленные права не учитываются, то еще был выведен файл с дополнительно установленным stiky битом. В последнем примере был использован плюс: –perm +664. Были выведены все файлы, у которых был установлен хотя бы один из перечисленных битов. То есть, были выведены оба файла и текущая директория (символ точка). Если использовать +1000 (все биты сброшены, за исключением stiky бита), будут выведены только файлы с установленным stiky битом, не зависимо от того какие еще права доступа у них определены.

$ find . -perm +1000
./test1
$

Программа find ищет файлы, но кроме поиска в программу встроена возможность выполнения действий над найденными файлами. Для этого можно использовать параметр –exec или –ok. Параметры позволяют выполнить любую программу, передавая этой программе в качестве аргумента найденный файл. Единственное отличие между параметрами заключается в том, что –ok требует от пользователя подтверждения выполнения программы, а –exec не требует.

Например, нам необходимо передать пользователю artur все файлы, не принадлежащие ни одному пользователю системы. Сначала мы посмотрим, какие файлы в директории /tmp не принадлежат ни одному пользователю системы.

# find /tmp -nouser
/tmp/mc-user5
#

Теперь все тоже самое, плюс параметр –exec.

# find /tmp -nouser -exec chown artur {} \;
#

После –exec вводится программа, которую необходимо выполнить и ее параметры: chown artur {} \;. Вместо {} find подставляет найденный файл, а \; завершает команду. И в заключение посмотрим, что получилось.

# find /tmp -nouser
# ls -ld /tmp/mc-user5
drwx------  2 artur students 4096 2005-08-22 10:39 /tmp/mc-user5/
# 

У программы есть много других параметров. Надеюсь, что вы обязательно почитаете документацию к программе, man find откроет вам много интересного.

Источник — «http://kryukov.biz/wiki/Find»
Инструменты
    
Личные инструменты