Введение
Одна из проблем, с которой сталкиваются пользователи, впервые осваивающие 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 file1Output
./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 -lOutput
1111Вероятно, это слишком много результатов, чтобы быть полезными в большинстве ситуаций. Чтобы ограничить их, вы можете указать максимальную глубину поиска в списке поиска верхнего уровня:
find -maxdepth num -name queryЧтобы найти file1 только в каталогах уровня 1 и выше, можно указать максимальную глубину 2 (1 для каталога верхнего уровня и 1 для каталогов уровня 1):
find -maxdepth 2 -name file1Output
./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 file1Output
./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 file1Output
./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 -SOutput
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.









