После завершения этого раздела вы сможете находить файлы в смонтированных файловых системах с помощью команд find и locate.
Системному администратору необходимы инструменты для поиска файлов, соответствующих определенным критериям, в файловой системе. В этом разделе рассматриваются две команды для поиска файлов в иерархии файловой системы.
Команда locate выполняет поиск имен файлов или путей к файлам в ранее созданном индексе и мгновенно возвращает результаты.
Команда find выполняет поиск файлов в режиме реального времени путем обхода каталогов иерархии файловой системы.
Команда locate находит файлы по имени или пути к файлу. Эта операция происходит быстро, поскольку поиск осуществляется в базе данных mlocate. Однако эта база данных не обновляется в режиме реального времени, и для получения точных результатов ее необходимо регулярно обновлять. Это также означает, что команда locate не найдет файлы, созданные с момента последнего обновления базы данных.
mlocate
База данных locate обновляется автоматически каждый день. Однако пользователь root может в любое время выполнить команду updatedb для принудительного немедленного обновления.
root
[root@host ~]# updatedb
[root@host ~]#
updatedb
Команда locate ограничивает результаты для непривилегированных пользователей. Чтобы увидеть найденное имя файла, у пользователя должно быть разрешение на поиск в каталоге, в котором находится файл.
Найдите файлы с фрагментом passwd в имени или пути в деревьях каталогов, доступных для чтения пользователю user на хосте host.
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...
[user@host ~]$
locate passwd
Результаты возвращаются даже в том случае, если имя файла или путь к файлу лишь частично соответствует поисковому запросу.
[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...
locate image
image
С опцией -i поиск осуществляется без учета регистра. При использовании этой опции все возможные сочетания прописных и строчных букв будут соответствовать поисковому запросу.
-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
locate -i messages
Опция -n ограничивает количество результатов поиска, возвращенных командой locate. В следующем примере количество результатов поиска, возвращенных командой locate, ограничено первыми пятью соответствиями:
-n
[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
locate -n 5 snow.png
Команда find ищет файлы в иерархии файловой системы в режиме реального времени. Это медленнее, чем при использовании команды locate, но зато точнее. Кроме того, эта команда может искать файлы не только по имени файла, но и по другим критериям, таким как права доступа к файлу, тип файла, его размер или время изменения.
Команда find просматривает файлы в файловой системе, применяя учетную запись пользователя, выполнившего поиск. Для просмотра содержимого каталога пользователь, выполняющий команду find, должен иметь разрешение на чтение и выполнение для этого каталога.
Первый аргумент команды find — каталог, в котором будет выполняться поиск. Если каталог не указан, команда find начинает поиск в текущем каталоге и ищет соответствия в любом из его подкаталогов.
Для поиска файлов по имени используйте опцию -name FILENAME. С этой опцией команда find возвращает путь к файлам, точно соответствующим имени файла (FILENAME). Например, для поиска файлов с именем sshd_config, начиная с каталога /, выполните следующую команду.
-name FILENAME
FILENAME
sshd_config
/
[root@host ~]# find / -name sshd_config /etc/ssh/sshd_config
find / -name sshd_config
В опциях команды find, состоящих из целых слов, используется один дефис, и опции следуют за аргументом пути, в отличие от большинства других команд Linux.
Для поиска файлов по имени и получения всех результатов, содержащих частичные совпадения, можно использовать метасимволы. При использовании метасимволов необходимо заключать искомое имя файла в кавычки, чтобы предотвратить интерпретацию терминалом этих символов.
В следующем примере выполняется поиск файлов в каталоге /, имена которых оканчиваются на .txt:
.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...
find / -name '*.txt'
Для поиска файлов в каталоге /etc/ на host, содержащих слово pass в любом месте имени, выполните следующую команду:
/etc/
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
find /etc -name '*pass*'
Для выполнения поиска по имени файла без учета регистра используйте опцию -iname, за которой следует искомое имя файла. Чтобы найти файлы, содержащие в именах текст messages без учета регистра, в каталоге / на host, выполните следующую команду:
-iname
messages
[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 / -iname '*messages*'
Поиск файлов на основе прав владения или разрешений
С помощью команды find можно искать файлы по владельцу или разрешениям. Полезные опции при поиске по владельцу: -user и -group (поиск по имени), а также -uid и -gid (поиск по идентификатору).
-user
-group
-uid
-gid
Найдите файлы, владельцем которых является пользователь user, в каталоге /home/user на host.
/home/user
[user@host ~]$ find -user user . ./.bash_logout ./.bash_profile ./.bashrc ./.bash_history
find -user user
Найдите файлы, владельцем которых является группа user, в каталоге /home/user на host.
[user@host ~]$ find -group user . ./.bash_logout ./.bash_profile ./.bashrc ./.bash_history
find -group user
Найдите файлы, владельцем которых является пользователь с идентификатором 1000, в каталоге /home/user на host.
1000
[user@host ~]$ find -uid 1000 . ./.bash_logout ./.bash_profile ./.bashrc ./.bash_history
find -uid 1000
Найдите файлы, владельцем которых является группа с идентификатором 1000, в каталоге /home/user на host.
[user@host ~]$ find -gid 1000 . ./.bash_logout ./.bash_profile ./.bashrc ./.bash_history
find -gid 1000
Опции -user и -group можно использовать вместе для поиска файлов, в которых пользователь-владелец и группа-владелец различаются. В примере ниже команда отображает файлы, принадлежащие пользователю root и связанные с группой mail.
mail
[root@host ~]# find / -user root -group mail /var/spool/mail ...output omitted...
Опция -perm используется для поиска файлов с определенным набором разрешений. Разрешения могут быть представлены в виде восьмеричных значений, состоящих из комбинации цифр 4, 2 и 1 для чтения, записи и выполнения соответственно. Перед разрешениями может стоять знак / или -.
-perm
4
2
1
-
Значение разрешения в числовом виде, перед которым стоит /, соответствует файлам, в которых установлен хотя бы один бит для пользователя, группы или остальных пользователей для данного набора разрешений. Файл с разрешениями r--r--r-- не соответствует значению /222, а файл с разрешениями rw-r--r-- соответствует. Знак - перед разрешением означает, что все три соответствующих бита должны быть установлены, поэтому ни один из предыдущих примеров не подойдет, а что-то вроде rw-rw-rw- подойдет.
r--r--r--
/222
rw-r--r--
rw-rw-rw-
Возьмем более сложный пример. При выполнении следующей команды будут найдены все файлы, для которых у пользователя есть разрешения на чтение, запись и выполнение, у участников группы есть разрешения на чтение и запись, а у остальных пользователей есть только разрешение на чтение.
[root@host ~]# find /home -perm 764
find /home -perm 764
Чтобы найти файлы, для которых у пользователя есть по крайней мере разрешения на запись и выполнение, у участников группы есть по крайней мере разрешение на запись и у остальных пользователей есть по крайней мере разрешение на чтение, выполните следующую команду.
[root@host ~]# find /home -perm -324
find /home -perm -324
Чтобы найти файлы, для которых у пользователя есть разрешение на чтение, у участников группы есть по крайней мере разрешение на чтение или у остальных пользователей есть по крайней мере разрешение на запись, выполните следующую команду.
[root@host ~]# find /home -perm /442
find /home -perm /442
При использовании с / или - значение 0 работает как метасимвол, поскольку означает разрешение ни на что.
0
Чтобы найти файлы в каталоге /home/user на host, для которых у остальных пользователей есть по крайней мере разрешение на чтение, выполните следующую команду.
[user@host ~]$ find -perm -004
find -perm -004
Найдите все файлы в каталоге /home/user на host, для которых у остальных пользователей есть разрешение на запись.
[user@host ~]$ find -perm -002
Поиск файлов по размеру
С помощью команды find можно находить файлы, размер которых соответствует значению, указанному с помощью опции -size, за которой следует число и единица измерения. Используйте следующие значения в качестве единиц с опцией -size:
-size
k для килобайта;
k
M для мегабайта;
M
G для гигабайта.
G
В приведенном ниже примере показано, как найти файлы размером 10 мегабайт с округлением в большую сторону.
[user@host ~]$ find -size 10M
find -size 10M
Чтобы найти файлы размером больше 10 гигабайт, выполните следующую команду.
[user@host ~]$ find -size +10G
find -size +10G
Чтобы найти все файлы размером меньше 10 килобайт, выполните следующую команду.
[user@host ~]$ find -size -10k
find -size -10k
Опция -size округляет все значения в большую сторону до целых единиц. Например, команда find -size 1M отображает файлы размером меньше 1 МБ, поскольку она округляет размеры файлов в большую сторону до 1 МБ.
Поиск файлов по времени изменения
Опция -mmin, за которой следует время в минутах, ищет все файлы, содержимое которых было изменено n минут назад. Метка времени для файла всегда округляется в меньшую сторону. Опция также поддерживает дробные значения при использовании с диапазонами (+n и -n).
-mmin
n
+n
Чтобы найти на host все файлы, содержимое которых было изменено 120 минут назад, выполните следующую команду.
[root@host ~]# find / -mmin 120
find / -mmin 120
Модификатор + перед количеством минут находит все файлы в каталоге /, которые были изменены больше n минут назад. В этом примере будут найдены файлы, которые были изменены больше 200 минут назад.
+
[root@host ~]# find / -mmin +200
find / -mmin +200
Модификатор - находит все файлы в каталоге /, которые были изменены меньше n минут назад. В этом примере будут найдены файлы, которые были изменены меньше 150 минут назад.
[root@host ~]# find / -mmin -150
find / -mmin -150
Поиск файлов по типу файла
Опция -type команды find ограничивает область поиска заданным типом файлов. Используйте следующие флаги, чтобы ограничить область поиска:
-type
f для обычных файлов;
f
d для каталогов;
d
l для символьных ссылок;
l
b для блочных устройств.
b
Найдите все каталоги в каталоге /etc на хосте host.
/etc
[root@host ~]# find /etc -type d /etc /etc/tmpfiles.d /etc/systemd /etc/systemd/system /etc/systemd/system/getty.target.wants ...output omitted...
find /etc -type d
Найдите все символьные ссылки на хосте host.
[root@host ~]# find / -type l
find / -type l
Отобразите список всех блочных устройств в каталоге /dev на хосте host.
/dev
[root@host ~]# find /dev -type b /dev/vda1 /dev/vda
find /dev -type b
При использовании опции -links с числом осуществляется поиск всех файлов с определенным количеством жестких ссылок. Модификатор + перед числовым значением осуществляет поиск файлов с количеством жестких ссылок, превышающим заданное значение. Модификатор - перед числовым значением осуществляет поиск всех файлов с количеством жестких ссылок, не превышающим заданное значение.
-links
Найдите все обычные файлы, имеющие более одной жесткой ссылки, на хосте host.
[root@host ~]# find / -type f -links +1
find / -type f -links +1
Man-страницы locate(1), updatedb(8) и find(1)
locate
find