Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

Поиск файла в Linux

8454
7 минут чтения
Средний рейтинг статьи: 3

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

VDS и VPS

Гибкие виртуальные серверы с почасовым
биллингом по всему миру: Россия, Азия и Европа.

Команда locate

Первая команда поиска файлов в Linux, которую мы рассмотрим, называется locate. Она осуществляет быстрый поиск по имени в специальной базе данных и выводит все имена, совпадающие с заданной подстрокой. Например, мы хотим найти все программы, начинающиеся с «zip». Так как будем искать именно программы, логично предположить, что имя директории заканчивается на «bin». Учитывая все это, попробуем найти нужные файлы:

    

locate осуществил поиск в базе данных путевых имен и вывел все имена, содержащие подстроку «bin/zip».

При более сложных критериях поиска можно комбинировать locate с другими программами, например grep:

    

Иногда возникают ситуации, когда в Linux поиск по названию файла с помощью locate работает некорректно (вывод имен удаленных файлов, отсутствие имен недавно созданных файлов). В таком случае нужно обновить базу данных индексов:

    

locate поддерживает работу с wildcards и регулярными выражениями. Если в строке содержатся метасимволы, то в качестве аргумента передается не подстрока, а шаблон, который сопоставляется с полным путевым именем. Допустим необходимо найти все имена с суффиксом «.png» в каталоге «Screenshots»:

    

Для поиска по регулярному выражению используется ключ -r (стандарт POSIX BRE):

    

Команда find

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

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

    

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

Критерии поиска

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

    

Данная команда вывела все подкаталоги в директории ~/playground. Поддерживается поиск по следующим типам:

  • b — блочное устройство.
  • с — символьное устройство.
  • d — директория.
  • f — регулярный файл.
  • l — символическая ссылка.

Мы также можем искать по размеру и имени, добавив дополнительные критерии. Попробуем найти регулярные файлы, совпадающие с шаблоном «.png» и имеющие размер более одного килобайта:

    

Опция -name позволяет указать имя. В приведенном примере используется wildcard-шаблон, поэтому он заключен в кавычки. Параметр -size ограничивает поиск по размеру. Знак + перед числом означает, что мы ищем файлы больше указанного размера, минус — меньше указанного размера. В случае отсутствия знака find выведет все файлы, точно совпадающие с заданным размером.

Символы, позволяющие указать размер:

  • b — 512-байтовые блоки. Используется по умолчанию, когда после числа отсутствует символ.
  • с — байты.
  • w — 2-байтовые слова.
  • k — килобайты.
  • M — мегабайты.
  • G — гигабайты.

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

Операторы

Из-за весомого количества критериев поиска, у нас возникает необходимость более точно описывать логические отношения между проверками. Например, нужно определить наличие ненадежных прав. Иными словам, надо вывести все файлы с правами не 0600 и все директории с правами не 0700. find предоставляет специальные логические операторы для комбинирования проверок такого рода:

    

Поддерживаются следующие логические операторы:

  • -and / -a —логическое И. Если не указаны операторы между несколькими проверками, подразумевается по умолчанию.
  • -or / -o — логическое ИЛИ.
  • -not / ! — логическое НЕ.
  • ( ) — позволяет объединять проверки и операторы для создания сложных выражений. Необходимо экранировать.

Предопределенные действия

В Linux поиск файла с помощью find можно объединить с некоторыми действиями над полученными файлами. Существует предопределенные и пользовательские действия. Для первого вида find предоставляет следующие опции:

  • -delete — удаление найденных файлов.
  • -ls — эквивалентно ls -dils.
  • -print — вывод полного имя файла. Действие по умолчанию.
  • -quit — завершение работы после первого совпадения по критериям.

Предположим, нам необходимо удалить все имена с суффиксом «.bak». Конечно, можно сразу использовать find с опцией -delete, но для безопасности лучше просто вывести список удаляемых файлов, а уже потом их удалить:

    

После проверки удаляем:

    

Пользовательские действия

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

    

Здесь, command — название команды, {} — символьное представление текущего путевого имени, ; — разделитель команд. Например, мы можем применить команду ls -l для каждого найденного файла:

    

Иногда команды могут принимать сразу несколько аргументов, например, rm. Чтобы не применять команду к каждому найденному имени, в конце -exec ставится символ + вместо разделителя:

    

Аналогичное действие можно сделать при помощи утилиты xargs. Она принимает на вход список аргументов и на основе их формирует команды. В качестве примера приведем известную команду для вывода файлов, содержащих в имени «неудобные» символы (пробелы, переводы строк и т.п.):

    

Аргумент -print0 заставляет разделять найденные имена нулевым символом (единственный символ, запрещенный в именах файлов). Опция -null в xargs указывает, что на вход подается список аргументов, разделенных нулевым символов.

Подготовили для вас выгодные тарифы на облачные серверы

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Заключение

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

8454
7 минут чтения
Средний рейтинг статьи: 3
Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server