Как использовать Find and Locate для поиска файлов в Linux

0 Акции
0
0
0
0

Введение

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

Предпосылки
  • Для выполнения этого руководства вам потребуется доступ к компьютеру с операционной системой Linux. Это может быть виртуальный частный сервер, к которому вы подключаетесь по SSH, или ваш локальный компьютер. Обратите внимание, что это руководство было проверено на сервере Linux под управлением Ubuntu 20.04, но представленные примеры должны работать на компьютере с любой версией любого дистрибутива Linux.

Найти по имени

Самый очевидный способ поиска файлов — по имени. Чтобы найти файл по имени, выполните команду находить, вам следует использовать следующую команду:

find -name "query"

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

find -iname "query"

Если вы хотите найти все файлы, которые не соответствуют определенному шаблону, вы можете сузить поиск с помощью -нет Обеспечить регресс:

find -not -name "query_to_avoid"

В качестве альтернативы вы можете отменить поиск, используя восклицательный знак (!), например:

find \! -name "query_to_avoid"

Обратите внимание, что если вы используете !, перед его использованием необходимо экранировать обратной косой чертой (\). находить может его интерпретировать, оболочка не пытается его интерпретировать.

Найти по типу

С параметром -тип Вы можете указать типы файлов, которые хотите найти. Вот как это работает:

find -type type_descriptor query

Вот некоторые дескрипторы, которые можно использовать для определения типа файла:

  • f: Обычный файл
  • d: каталог
  • l: символическая ссылка
  • c: Символьные устройства
  • b: Блокирует устройства

Например, если вы хотите найти все символьные устройства в вашей системе, вы можете выполнить следующую команду:

find /dev -type c

Эта команда ищет устройства только в папке /dev, каталоге, где обычно устанавливаются файлы устройств в системах Linux:

Output
/dev/vcsa5
/dev/vcsu5
/dev/vcs5
/dev/vcsa4
/dev/vcsu4
/dev/vcs4
/dev/vcsa3
/dev/vcsu3
/dev/vcs3
/dev/vcsa2
/dev/vcsu2
/dev/vcs2
. . .

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

find /usr -type f -name "*.conf"
Output
/usr/src/linux-headers-5.4.0-88-generic/include/config/auto.conf
/usr/src/linux-headers-5.4.0-88-generic/include/config/tristate.conf
/usr/src/linux-headers-5.4.0-90-generic/include/config/auto.conf
/usr/src/linux-headers-5.4.0-90-generic/include/config/tristate.conf
/usr/share/adduser/adduser.conf
/usr/share/ufw/ufw.conf
/usr/share/popularity-contest/default.conf
/usr/share/byobu/keybindings/tmux-screen-keys.conf
/usr/share/libc-bin/nsswitch.conf
/usr/share/rsyslog/50-default.conf
. . .

Фильтр по времени и размеру

находить Он предоставляет вам различные способы фильтрации результатов по размеру и времени.

Размер

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

  • c: байты
  • к: килобайт
  • м: мегабайт
  • г: гигабайт
  • б: блоки по 512 байт

Для иллюстрации следующая команда найдет любой файл в каталоге /usr длиной ровно 50 байт:

find /usr -size 50c

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

find /usr -size -50c

Чтобы найти файлы в папке /usr, размер которых превышает 700 МБ, вы можете использовать следующую команду:

find /usr -size +700M
Время

Для каждого файла в системе Linux сохраняет временные метки времени доступа, времени изменения и времени модификации.

  • Время доступа: время последнего чтения или записи файла.
  • Время изменения: время последнего изменения содержимого файла.
  • Время изменения: время последнего изменения метаданных инода файла.

Использование опций время- ,mtime- и -ctime, вы можете основывать свои поисковые запросы на этих параметрах. Для каждого из этих параметров необходимо указать значение, указывающее, сколько дней в прошлом вы хотите найти. Подобно параметрам размера, описанным ранее, перед этими параметрами можно добавлять знаки плюс или минус, чтобы указать «больше» или «меньше».

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

find /usr -mtime 1

Если вам нужны файлы, к которым вы обращались менее суток назад, вы можете выполнить следующую команду:

find /usr -atime -1

Чтобы найти файлы, метаданные которых последний раз изменялись более 3 дней назад, вы можете выполнить следующее:

find /usr -ctime +3

Эти параметры также имеют сопутствующие параметры, которые можно использовать для указания минут вместо дней:

find /usr -mmin -1

Будут показаны файлы, которые были изменены в последний раз.

находить Он также может сравниваться с эталонным файлом и возвращать более новые элементы:

find / -newer reference_file

Этот синтаксис возвращает любой файл в системе, который был создан или изменен недавно относительно ссылочного файла.

Найти по владельцу и разрешениям

Вы также можете искать файлы по пользователю или группе, которой принадлежит файл, используя параметры -user и -group. Чтобы найти любой файл в каталоге /var, принадлежащий пользователю syslog, выполните следующую команду:

find /var -user syslog

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

find /etc -group shadow

Вы также можете искать файлы с определенными разрешениями.

Если вы хотите сопоставить точный набор разрешений, вы можете использовать этот синтаксис, который указывает разрешения с помощью восьмеричной записи:

find / -perm 644

Это позволяет точно подобрать файлы с указанными разрешениями.

Если вы хотите указать что-то, имеющее по крайней мере следующие разрешения, вы можете поставить перед символом разрешений знак минус:

find / -perm -644

Это соответствует любому файлу с дополнительными разрешениями. В этом примере соответствует файл с разрешениями 744.

Фильтрация по глубине

В этом разделе вы создадите пример структуры каталогов, которую затем будете использовать для анализа и фильтрации файлов по глубине их расположения. Если вы следуете примерам из этого руководства, разумно создать эти файлы и каталоги в папке /tmp/. /tmp/ — это временный каталог, то есть все файлы и каталоги в нём будут удалены при следующей загрузке сервера. Это будет полезно для целей данного руководства, поскольку вы можете создать столько каталогов, файлов и ссылок, сколько захотите, не беспокоясь о том, что они впоследствии приведут к сбою вашей системы. После выполнения команд из этого раздела ваш каталог /tmp/ будет содержать три уровня каталогов, по десять каталогов на первом уровне. Каждый каталог (включая временный каталог) будет содержать десять файлов и десять подкаталогов.

Создайте пример структуры каталогов в папке /tmp/ с помощью следующей команды:

mkdir -p /tmp/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}

После этого заполните эти каталоги некоторыми образцами файлов с помощью команды touch:

touch /tmp/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}

Разместив эти файлы и каталоги, перейдите в каталог test/, который вы только что создали:

cd /tmp/test

Чтобы получить базовое представление о том, как извлекать файлы из этой структуры, начните с поиска обычного имени, соответствующего любому файлу с именем file1:

find -name file1
Output
./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
./level1dir7/level2dir8/level3dir6/file1
./level1dir7/level2dir8/level3dir5/file1
./level1dir7/level2dir8/file1
. . .

Это даст множество результатов. Если вы перенаправите вывод в счётчик, то увидите, что всего будет 1111 результатов:

find -name file1 | wc -l
Output
1111

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

find -maxdepth num -name query

Чтобы найти file1 только в каталогах уровня 1 и выше, можно указать максимальную глубину 2 (1 для каталога верхнего уровня и 1 для каталогов уровня 1):

find -maxdepth 2 -name file1
Output
./level1dir7/file1
./level1dir1/file1
./level1dir3/file1
./level1dir8/file1
./level1dir6/file1
./file1
./level1dir2/file1
./level1dir9/file1
./level1dir4/file1
./level1dir5/file1
./level1dir10/file1

Это вполне управляемый список.

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

find -mindepth num -name query

Вы можете использовать это для поиска только файлов в конце ветвей каталога:

find -mindepth 4 -name file1
Output
./level1dir7/level2dir8/level3dir9/file1
./level1dir7/level2dir8/level3dir3/file1
./level1dir7/level2dir8/level3dir4/file1
./level1dir7/level2dir8/level3dir1/file1
./level1dir7/level2dir8/level3dir8/file1
./level1dir7/level2dir8/level3dir7/file1
./level1dir7/level2dir8/level3dir2/file1
. . .

Опять же, он возвращает большое количество результатов (1000) из-за структуры ветвей и файлов.

Вы можете объединить параметры минимальной и максимальной глубины, чтобы сосредоточиться на узком диапазоне:

find -mindepth 2 -maxdepth 3 -name file1
Output
./level1dir7/level2dir8/file1
./level1dir7/level2dir5/file1
./level1dir7/level2dir7/file1
./level1dir7/level2dir2/file1
./level1dir7/level2dir10/file1
./level1dir7/level2dir6/file1
./level1dir7/level2dir3/file1
./level1dir7/level2dir4/file1
./level1dir7/file1
. . .

Такое объединение этих параметров значительно сократит результаты: вместо прежних 1000 строк будет возвращено всего 110.

Выполнение команд для поиска результатов

Вы можете использовать параметр -exec Запустите пользовательскую вспомогательную команду для всего, что соответствует, с помощью следующей команды:

find find_parameters -exec command_and_options {} \;

{} используется как заполнители для соответствующих файлов. \; позволяет нам узнать, где заканчивается команда.

Например, предположим, что вы все еще находитесь в каталоге /test/, который вы создали на предыдущем шаге в папке /tmp/, вы можете найти файлы из предыдущего раздела с правами доступа 644 и изменить их на 664:

find . -type f -perm 644 -exec chmod 664 {} \;

Аналогичным образом можно изменить права доступа к каталогу:

find . -type d -perm 755 -exec chmod 700 {} \;

В этом примере выполняется поиск любого каталога с правами доступа 755, а затем изменение прав доступа на 700.

Поиск файлов с помощью Locate

Альтернатива использованию находить Заказ найти Эта команда часто выполняется быстрее и позволяет легко выполнить поиск по всей файловой системе.

Вы можете установить команду в Debian или Ubuntu с помощью apt, обновив список пакетов и затем установив пакет molocate:

sudo apt update
sudo apt install mlocate

В Rocky Linux, CentOS и других дистрибутивах на основе RedHat для установки mlocate можно использовать команду dnf:

sudo dnf install mlocate

Команда locate работает быстрее, чем find, потому что использует базу данных, содержащую список всех файлов в файловой системе. Эта база данных обычно обновляется раз в день с помощью cron-скрипта, но вы можете обновить её вручную с помощью команды updatedb. Теперь выполните следующую команду с правами sudo:

sudo updatedb

Помните: если вы хотите найти новые файлы, база данных местоположений должна быть всегда актуальной. Если вы добавите новые файлы до запуска cron-скрипта или команды updatedb, они не появятся в результатах запроса.

Местоположение позволяет фильтровать результаты различными способами. Самый простой способ поиска файлов — использовать следующий синтаксис:

locate query

Этот запрос будет соответствовать любому файлу или каталогу, содержащему строку запроса, в любом месте пути к файлу. Чтобы возвращать только файлы, имена которых содержат сам запрос, а не файлы, содержащие запрос в каталогах, ведущих к нему, можно добавить флаг -b для поиска только файлов, «базовое имя» которых совпадает с запросом:

locate -b query

Чтобы команда locate возвращала только те результаты, которые все еще существуют в файловой системе (т. е. файлы, которые не были удалены между последним вызовом updatedb и текущим вызовом locate), используйте -e:

locate -e query

Статистику об информации, в которой указано местоположение, можно получить с помощью опции -S:

locate -S
Output
Database /var/lib/mlocate/mlocate.db:
21015 directories
136787 files
7727763 bytes in file names
3264413 bytes used to store database

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

Результат

Find и locate — полезные инструменты для поиска файлов в вашей системе. Обе команды — мощные, и их можно улучшить, комбинируя с другими инструментами через конвейеры, но выбор подходящего инструмента зависит от вас. Далее мы рекомендуем вам продолжить эксперименты с find и locate. Вы можете прочитать соответствующие страницы руководства, чтобы узнать о других возможностях, не рассмотренных в этом руководстве. Вы также можете анализировать и обрабатывать результаты поиска, передавая их другим командам, таким как wc, sort и grep.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может понравиться