В Unix-подобных операционных системах файл представляет собой нечто большее, чем просто именованное пространство на диске. Это универсальный интерфейс доступа к информации. С помощью него решаются многие специфичные задачи, такие как работа с устройствами, получение данных из ядра, межпроцессная коммуникация. Поэтому важно уметь быстро находить нужную информацию по названию и другим критериям. В этой статье рассмотрим, как осуществить поиск файла в терминале Linux.
cloud
Первая команда поиска файлов в Linux, которую мы рассмотрим, называется locate
. Она осуществляет быстрый поиск по имени в специальной базе данных и выводит все имена, совпадающие с заданной подстрокой. Например, мы хотим найти все программы, начинающиеся с «zip». Так как будем искать именно программы, логично предположить, что имя директории заканчивается на «bin». Учитывая все это, попробуем найти нужные файлы:
locate bin/zip
/usr/bin/zip
/usr/bin/zipcloak
/usr/bin/zipdetails
/usr/bin/zipgrep
locate
осуществил поиск в базе данных путевых имен и вывел все имена, содержащие подстроку «bin/zip».
При более сложных критериях поиска можно комбинировать locate
с другими программами, например grep
:
locate bin | grep zip
/usr/bin/bunzip2
/usr/bin/bzip2
/usr/bin/bzip2recover
/usr/bin/gunzip
/usr/bin/gzip
/usr/bin/p7zip
/usr/bin/pbzip2
/usr/bin/unzip
/usr/bin/unzipsfx
/usr/bin/zip
/usr/bin/zipcloak
/usr/bin/zipdetails
/usr/bin/zipgrep
Иногда возникают ситуации, когда в Linux поиск по названию файла с помощью locate
работает некорректно (вывод имен удаленных файлов, отсутствие имен недавно созданных файлов). В таком случае нужно обновить базу данных индексов:
sudo updatedb
locate
поддерживает работу с wildcards и регулярными выражениями. Если в строке содержатся метасимволы, то в качестве аргумента передается не подстрока, а шаблон, который сопоставляется с полным путевым именем. Допустим необходимо найти все имена с суффиксом «.png» в каталоге «Screenshots»:
locate '*Screenshots/*.png'
/home/user/Pictures/Screenshots/Screenshot from 2022-09-29 12-32-52.png
/home/user/Pictures/Screenshots/Screenshot from 2022-09-29 17-05-12.png
/home/user/Pictures/Screenshots/Screenshot from 2022-09-29 18-27-35.png
/home/user/Pictures/Screenshots/Screenshot from 2022-09-29 18-30-06.png
Для поиска по регулярному выражению используется ключ -r
(стандарт POSIX BRE):
locate -r 'bin/\(bz\|gz\|zip\)'
find
является основным инструментов для поиска файлов в Linux через консоль. В отличие от locate
, find
позволяет находить файлы не только по имени, но и по другим разнообразным критериям: по размеру, дате создания, по правам и т.п.
В простом случае в качестве аргумента передается имя директории. find
осуществляет поиск файла в каталоге Linux, который мы указали, а также во всех подкаталогах. Без указания опций, команда выводит список всех файлов. Например, для получения всех имен в домашней директории можно использовать такую команду:
find ~
Вывод будет очень большим, так как find
напечатает все имена в указанном каталоге и подкаталогов. Чтобы сделать поиск более конкретным, используются специальный опции, позволяющие задать критерии.
Допустим, нам нужно вывести файлы, являющиеся только каталогами. Опция -type
позволяет задать тип:
find ~/playground/ -type d
/home/gendo/playground/
/home/gendo/playground/bash
/home/gendo/playground/alis
/home/gendo/playground/test
/home/gendo/playground/ubuntussh
/home/gendo/playground/src
/home/gendo/playground/src/diction-1.11
/home/gendo/playground/src/diction-1.11/test
Данная команда вывела все подкаталоги в директории ~/playground
. Поддерживается поиск по следующим типам:
b
— блочное устройство.с
— символьное устройство.d
— директория.f
— регулярный файл.l
— символическая ссылка.Мы также можем искать по размеру и имени, добавив дополнительные критерии. Попробуем найти регулярные файлы, совпадающие с шаблоном «.png» и имеющие размер более одного килобайта:
find ~ -type f -name "*.png" -size +1k
/Pictures/Screenshots/Screenshot from 2022-09-28 22-50-20.png
/home/user/Pictures/Screenshots/Screenshot from 2022-09-28 11-45-59.png
/Pictures/Screenshots/Screenshot from 2022-09-23 12-02-23.png
/Pictures/Screenshots/Screenshot from 2022-09-21 21-06-19.png
Опция -name
позволяет указать имя. В приведенном примере используется wildcard-шаблон, поэтому он заключен в кавычки. Параметр -size
ограничивает поиск по размеру. Знак +
перед числом означает, что мы ищем файлы больше указанного размера, минус — меньше указанного размера. В случае отсутствия знака find
выведет все файлы, точно совпадающие с заданным размером.
Символы, позволяющие указать размер:
b
— 512-байтовые блоки. Используется по умолчанию, когда после числа отсутствует символ.с
— байты.w
— 2-байтовые слова.k
— килобайты.M
— мегабайты.G
— гигабайты.find
поддерживает огромное число проверок, позволяющие выполнить поиск файла в директории Linux по разным критериям. Все их можно посмотреть в документации.
Из-за весомого количества критериев поиска, у нас возникает необходимость более точно описывать логические отношения между проверками. Например, нужно определить наличие ненадежных прав. Иными словам, надо вывести все файлы с правами не 0600 и все директории с правами не 0700. find
предоставляет специальные логические операторы для комбинирования проверок такого рода:
find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)
Поддерживаются следующие логические операторы:
-and
/ -a
—логическое И. Если не указаны операторы между несколькими проверками, подразумевается по умолчанию.-or
/ -o
— логическое ИЛИ.-not
/ !
— логическое НЕ.( )
— позволяет объединять проверки и операторы для создания сложных выражений. Необходимо экранировать.В Linux поиск файла с помощью find
можно объединить с некоторыми действиями над полученными файлами. Существует предопределенные и пользовательские действия. Для первого вида find
предоставляет следующие опции:
-delete
— удаление найденных файлов.-ls
— эквивалентно ls -dils
.-print
— вывод полного имя файла. Действие по умолчанию.-quit
— завершение работы после первого совпадения по критериям.Предположим, нам необходимо удалить все имена с суффиксом «.bak». Конечно, можно сразу использовать find
с опцией -delete
, но для безопасности лучше просто вывести список удаляемых файлов, а уже потом их удалить:
find ~ -type f -name '*.bak' -print
/backup/5.bak
/backup/10.bak
/backup/9.bak
/backup/6.bak
/backup/8.bak
/backup/2.bak
/backup/3.bak
/backup/4.bak
/backup/1.bak
/backup/7.bak
После проверки удаляем:
find ~ -type f -name '.bak' -delete
Поиск файлов в консоли с помощью find
можно комбинировать со всевозможными утилитами с помощью пользовательских действий:
-exec command ‘{}’ ‘;’
Здесь, command
— название команды, {}
— символьное представление текущего путевого имени, ;
— разделитель команд. Например, мы можем применить команду ls -l
для каждого найденного файла:
find ~ -type f -name 'foo*' -exec ls -l '{}' ';'
-rw-rw-r-- 1 gendo gendo 0 Sep 30 09:59 /fooD
-rw-rw-r-- 1 gendo gendo 0 Sep 30 09:59 /fooB
-rw-rw-r-- 1 gendo gendo 0 Sep 30 09:59 /fooA
-rw-rw-r-- 1 gendo gendo 0 Sep 30 09:59 /fooC
Иногда команды могут принимать сразу несколько аргументов, например, rm
. Чтобы не применять команду к каждому найденному имени, в конце -exec
ставится символ +
вместо разделителя:
find ~ -type f -name 'foo*' -exec ls -l '{}' +
-rw-rw-r-- 1 gendo gendo 0 Sep 30 09:59 /fooD
-rw-rw-r-- 1 gendo gendo 0 Sep 30 09:59 /fooB
-rw-rw-r-- 1 gendo gendo 0 Sep 30 09:59 /fooA
-rw-rw-r-- 1 gendo gendo 0 Sep 30 09:59 /fooC
Аналогичное действие можно сделать при помощи утилиты xargs
. Она принимает на вход список аргументов и на основе их формирует команды. В качестве примера приведем известную команду для вывода файлов, содержащих в имени «неудобные» символы (пробелы, переводы строк и т.п.):
find ~ -iname '*.jpg' -print0 | xargs --null ls -l
Аргумент -print0
заставляет разделять найденные имена нулевым символом (единственный символ, запрещенный в именах файлов). Опция -null
в xargs
указывает, что на вход подается список аргументов, разделенных нулевым символов.
Подготовили для вас выгодные тарифы на облачные серверы
В Linux поиск файла по имени осуществляется с помощью команд locate
и find
. Конечно, для этих целей можно использовать файловые менеджеры с привычным графическим интерфейсом. Однако рассмотренные утилиты помогают сделать процесс поиска более гибким и эффективным.