Red Hat System Administration I 8.2

Поиск файлов в системе

Задачи

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

Поиск файлов

Системному администратору необходимы инструменты для поиска файлов, соответствующих определенным критериям, в файловой системе. В этом разделе рассматриваются две команды для поиска файлов в иерархии файловой системы.

  • Команда locate выполняет поиск имен файлов или путей к файлам в ранее созданном индексе и мгновенно возвращает результаты.

  • Команда find выполняет поиск файлов в режиме реального времени путем обхода каталогов иерархии файловой системы.

Поиск файлов по имени

Команда locate находит файлы по имени или пути к файлу. Эта операция происходит быстро, поскольку поиск осуществляется в базе данных mlocate. Однако эта база данных не обновляется в режиме реального времени, и для получения точных результатов ее необходимо регулярно обновлять. Это также означает, что команда locate не найдет файлы, созданные с момента последнего обновления базы данных.

База данных locate обновляется автоматически каждый день. Однако пользователь root может в любое время выполнить команду updatedb для принудительного немедленного обновления.

[root@host ~]# updatedb

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

Найдите файлы с фрагментом passwd в имени или пути в деревьях каталогов, доступных для чтения пользователю user на хосте host.

[user@host ~]$ locate passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
/usr/bin/grub2-mkpasswd-pbkdf2
/usr/bin/lppasswd
/usr/bin/passwd
...output omitted...

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

[root@host ~]# locate image
/etc/selinux/targeted/contexts/virtual_image_context
/usr/bin/grub2-mkimage
/usr/lib/sysimage
/usr/lib/dracut/dracut.conf.d/02-generic-image.conf
/usr/lib/firewalld/services/ovirt-imageio.xml
/usr/lib/grub/i386-pc/lnxboot.image
...output omitted...

С опцией -i поиск осуществляется без учета регистра. При использовании этой опции все возможные сочетания прописных и строчных букв будут соответствовать поисковому запросу.

[user@host ~]$ locate -i messages
...output omitted...
/usr/share/vim/vim80/lang/zh_TW/LC_MESSAGES
/usr/share/vim/vim80/lang/zh_TW/LC_MESSAGES/vim.mo
/usr/share/vim/vim80/lang/zh_TW.UTF-8/LC_MESSAGES
/usr/share/vim/vim80/lang/zh_TW.UTF-8/LC_MESSAGES/vim.mo
/usr/share/vim/vim80/syntax/messages.vim
/usr/share/vim/vim80/syntax/msmessages.vim
/var/log/messages

Опция -n ограничивает количество результатов поиска, возвращенных командой locate. В следующем примере количество результатов поиска, возвращенных командой locate, ограничено первыми пятью соответствиями:

[user@host ~]$ locate -n 5 snow.png
/usr/share/icons/HighContrast/16x16/status/weather-snow.png
/usr/share/icons/HighContrast/22x22/status/weather-snow.png
/usr/share/icons/HighContrast/24x24/status/weather-snow.png
/usr/share/icons/HighContrast/256x256/status/weather-snow.png
/usr/share/icons/HighContrast/32x32/status/weather-snow.png

Поиск файлов в режиме реального времени

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

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

Первый аргумент команды find — каталог, в котором будет выполняться поиск. Если каталог не указан, команда find начинает поиск в текущем каталоге и ищет соответствия в любом из его подкаталогов.

Для поиска файлов по имени используйте опцию -name FILENAME. С этой опцией команда find возвращает путь к файлам, точно соответствующим имени файла (FILENAME). Например, для поиска файлов с именем sshd_config, начиная с каталога /, выполните следующую команду.

[root@host ~]# find / -name sshd_config
/etc/ssh/sshd_config

Примечание

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

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

В следующем примере выполняется поиск файлов в каталоге /, имена которых оканчиваются на .txt:

[root@host ~]# find / -name '*.txt'
/etc/pki/nssdb/pkcs11.txt
/etc/brltty/brl-lt-all.txt
/etc/brltty/brl-mb-all.txt
/etc/brltty/brl-md-all.txt
/etc/brltty/brl-mn-all.txt
...output omitted...

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

[root@host ~]# find /etc -name '*pass*'
/etc/security/opasswd
/etc/pam.d/passwd
/etc/pam.d/password-auth
/etc/passwd-
/etc/passwd
/etc/authselect/password-auth

Для выполнения поиска по имени файла без учета регистра используйте опцию -iname, за которой следует искомое имя файла. Чтобы найти файлы, содержащие в именах текст messages без учета регистра, в каталоге / на host, выполните следующую команду:

[root@host ~]# find / -iname '*messages*'
...output omitted...
/usr/share/vim/vim80/lang/zh_CN.UTF-8/LC_MESSAGES
/usr/share/vim/vim80/lang/zh_CN.cp936/LC_MESSAGES
/usr/share/vim/vim80/lang/zh_TW/LC_MESSAGES
/usr/share/vim/vim80/lang/zh_TW.UTF-8/LC_MESSAGES
/usr/share/vim/vim80/syntax/messages.vim
/usr/share/vim/vim80/syntax/msmessages.vim

Поиск файлов на основе прав владения или разрешений

С помощью команды find можно искать файлы по владельцу или разрешениям. Полезные опции при поиске по владельцу: -user и -group (поиск по имени), а также -uid и -gid (поиск по идентификатору).

Найдите файлы, владельцем которых является пользователь user, в каталоге /home/user на host.

[user@host ~]$ find -user user
.
./.bash_logout
./.bash_profile
./.bashrc
./.bash_history

Найдите файлы, владельцем которых является группа user, в каталоге /home/user на host.

[user@host ~]$ find -group user
.
./.bash_logout
./.bash_profile
./.bashrc
./.bash_history

Найдите файлы, владельцем которых является пользователь с идентификатором 1000, в каталоге /home/user на host.

[user@host ~]$ find -uid 1000
.
./.bash_logout
./.bash_profile
./.bashrc
./.bash_history

Найдите файлы, владельцем которых является группа с идентификатором 1000, в каталоге /home/user на host.

[user@host ~]$ find -gid 1000
.
./.bash_logout
./.bash_profile
./.bashrc
./.bash_history

Опции -user и -group можно использовать вместе для поиска файлов, в которых пользователь-владелец и группа-владелец различаются. В примере ниже команда отображает файлы, принадлежащие пользователю root и связанные с группой mail.

[root@host ~]# find / -user root -group mail
/var/spool/mail
...output omitted...

Опция -perm используется для поиска файлов с определенным набором разрешений. Разрешения могут быть представлены в виде восьмеричных значений, состоящих из комбинации цифр 4, 2 и 1 для чтения, записи и выполнения соответственно. Перед разрешениями может стоять знак / или -.

Значение разрешения в числовом виде, перед которым стоит /, соответствует файлам, в которых установлен хотя бы один бит для пользователя, группы или остальных пользователей для данного набора разрешений. Файл с разрешениями r--r--r-- не соответствует значению /222, а файл с разрешениями rw-r--r-- соответствует. Знак - перед разрешением означает, что все три соответствующих бита должны быть установлены, поэтому ни один из предыдущих примеров не подойдет, а что-то вроде rw-rw-rw- подойдет.

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

[root@host ~]# find /home -perm 764

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

[root@host ~]# find /home -perm -324

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

[root@host ~]# find /home -perm /442

При использовании с / или - значение 0 работает как метасимвол, поскольку означает разрешение ни на что.

Чтобы найти файлы в каталоге /home/user на host, для которых у остальных пользователей есть по крайней мере разрешение на чтение, выполните следующую команду.

[user@host ~]$ find -perm -004

Найдите все файлы в каталоге /home/user на host, для которых у остальных пользователей есть разрешение на запись.

[user@host ~]$ find -perm -002

Поиск файлов по размеру

С помощью команды find можно находить файлы, размер которых соответствует значению, указанному с помощью опции -size, за которой следует число и единица измерения. Используйте следующие значения в качестве единиц с опцией -size:

  • k для килобайта;

  • M для мегабайта;

  • G для гигабайта.

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

[user@host ~]$ find -size 10M

Чтобы найти файлы размером больше 10 гигабайт, выполните следующую команду.

[user@host ~]$ find -size +10G

Чтобы найти все файлы размером меньше 10 килобайт, выполните следующую команду.

[user@host ~]$ find -size -10k

Важно

Опция -size округляет все значения в большую сторону до целых единиц. Например, команда find -size 1M отображает файлы размером меньше 1 МБ, поскольку она округляет размеры файлов в большую сторону до 1 МБ.

Поиск файлов по времени изменения

Опция -mmin, за которой следует время в минутах, ищет все файлы, содержимое которых было изменено n минут назад. Метка времени для файла всегда округляется в меньшую сторону. Опция также поддерживает дробные значения при использовании с диапазонами (+n и -n).

Чтобы найти на host все файлы, содержимое которых было изменено 120 минут назад, выполните следующую команду.

[root@host ~]# find / -mmin 120

Модификатор + перед количеством минут находит все файлы в каталоге /, которые были изменены больше n минут назад. В этом примере будут найдены файлы, которые были изменены больше 200 минут назад.

[root@host ~]# find / -mmin +200

Модификатор - находит все файлы в каталоге /, которые были изменены меньше n минут назад. В этом примере будут найдены файлы, которые были изменены меньше 150 минут назад.

[root@host ~]# find / -mmin -150

Поиск файлов по типу файла

Опция -type команды find ограничивает область поиска заданным типом файлов. Используйте следующие флаги, чтобы ограничить область поиска:

  • f для обычных файлов;

  • d для каталогов;

  • l для символьных ссылок;

  • b для блочных устройств.

Найдите все каталоги в каталоге /etc на хосте host.

[root@host ~]# find /etc -type d
/etc
/etc/tmpfiles.d
/etc/systemd
/etc/systemd/system
/etc/systemd/system/getty.target.wants
...output omitted...

Найдите все символьные ссылки на хосте host.

[root@host ~]# find / -type l

Отобразите список всех блочных устройств в каталоге /dev на хосте host.

[root@host ~]# find /dev -type b
/dev/vda1
/dev/vda

При использовании опции -links с числом осуществляется поиск всех файлов с определенным количеством жестких ссылок. Модификатор + перед числовым значением осуществляет поиск файлов с количеством жестких ссылок, превышающим заданное значение. Модификатор - перед числовым значением осуществляет поиск всех файлов с количеством жестких ссылок, не превышающим заданное значение.

Найдите все обычные файлы, имеющие более одной жесткой ссылки, на хосте host.

[root@host ~]# find / -type f -links +1

Ссылки

Man-страницы locate(1), updatedb(8) и find(1)