Код
#статьи

Find в Linux: что это за команда и как ей пользоваться

Найдётся всё.

Иллюстрация: Оля Ежак для Skillbox Media

Стандартная утилита для поиска в Linux-подобных системах ищет файлы и каталоги только по их названию. Чтобы повысить точность результатов и отфильтровать их, можно использовать утилиту find. Она есть в Ubuntu, Fedora, Mint и других дистрибутивах.

Содержание

Эксперт

Галина Артемьева

Инженер во ФГУП «РФЯЦ — ВНИИТФ им. академика Е. И. Забабахина», эксперт Skillbox по кибербезопасности Linux (администрирование ОС Linux).

Утилита find

Find — одна из самых полезных команд Linux для тех, кто работает с сотнями и тысячами файлов на своём компьютере. Например, для системных администраторов. Как можно догадаться из названия, она помогает найти нужные файлы и каталоги, причём не только по их именам.

Команда find имеет определённую структуру:

find [каталог] [параметры] [критерий поиска] [паттерн]

Разберём её по частям:

find — команда запуска поиска.

Каталог — это путь к папке, в которой мы будем что-то искать. Если не задать его вручную, то по умолчанию используется /home/имя_учётной_записи, где хранятся файлы, созданные пользователем.

Параметры — дополнительный критерий поиска. Например, можно искать только файлы или только каталоги.

Критерий поиска — указание на особенности файлов, по которым мы будем их искать: имя, дата создания или расширение.

Паттерн — значение, по которому будут отбираться файлы: их дата изменения, права доступа и так далее.

Практика: пишем запросы в find

Рассмотрим варианты применения утилиты find. Начнём с простого поиска и затем перейдём к настройке критериев поиска и паттернов.

Просто find

При запуске терминала по умолчанию поиск идёт в каталоге /home/имя_учётной_записи. Если вы введёте команду find без дополнительных параметров, то получите список всех файлов, хранящихся в нём:

Результат поиска при помощи утилиты find
Скриншот: Skillbox Media

Поиск файлов в определённом каталоге

Откроем папку Документы и посмотрим, какие файлы в ней есть. Для этого используем команду:

$ find ./Документы

У нас в этой папке лежит три документа:

Результат поиска при помощи утилиты find
Скриншот: Skillbox Media

На вашем устройстве результат поиска будет другой.

Поиск по имени: find name

Чтобы найти файл по имени, нужно к find добавить критерий поиска -name. Название не обязательно писать целиком. Будет достаточно нескольких букв и символа * после них. Например Озе*, вместо Озеро. Так find найдёт все файлы, содержащие такой набор букв в названии:

$ find . -name “Озе*”
Мы нашли все файлы, которые содержат в себе «Озе»
Скриншот: Skillbox Media

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

$ find . -not -name “Озе*”

Поиск по расширению

Для того чтобы найти файлы с определённым расширением, к строке поиска добавляется его наименование в двойных кавычках. Например, изображения в формате JPG, можно найти так:

$ find . -name “*.jpg”

Результат поиска:

find нашла все файлы с расширением JPG
Скриншот: Skillbox Media

Для поиска можно указать сразу несколько форматов, например .jpg и .webp. Для этого используется команда -o, выполняющая функцию логического оператора ИЛИ:

$ find . -name “*.jpg” -o -name “*.webp”

В результате find найдёт все файлы с расширением .jpg или .webp:

Скриншот: Skillbox Media

Поиск по типу файла: find file

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

  • d — для каталогов;
  • f — для файлов.

Попробуем найти каталог .var. Явно укажем, что ищем именно папку, а не файл с таким именем:

$ find . -type d -name “.var”

Всё получилось:

Скриншот: Skillbox Media

Теперь попробуем найти файлы с sdk в названии. Укажем это в запросе:

$ find . -type f -name “sdk*”

В ответ получаем один файл sdk.properties:

Скриншот: Skillbox Media

Поиск с исключением

Если есть несколько форматов файлов, например изображений с озером, можно исключить часть из них. Вернёмся к изображениям со словом «Озеро» в названии и найдём все, кроме тех, что имеют формат .webp.

Для этого используем уже знакомый логический оператор -not, который укажем перед параметром для исключения:

$ find . -name “Озеро*” -not -name “*.webp”

В результате у нас только файлы с расширением .jpg:

Скриншот: Skillbox Media

Поиск в нескольких каталогах

Иногда файлы, которые требуется найти, находятся не в одном каталоге, а в нескольких. Чтобы не писать команду поиска дважды, можно перечислить папки через пробел.

Найдём все файлы с расширениями .jpg и .docx, которые находятся в каталогах Документы и Изображения. Имена папок указываем после find ., не забывая про символ / перед ними:

$ find . /Документы /Изображения –type f –name “*.jpg” –o –name “*.docx”

В ответ получаем список файлов в двух каталогах:

Скриншот: Skillbox Media

Файлы, принадлежащие пользователю

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

$ find . -user имя_пользователя

или

$ find ./Документы -user имя_пользователя

Второй вариант подойдёт для поиска в конкретном каталоге.

Эти же команды можно применять для групп пользователей. Достаточно заменить параметр -user на -group.

Посмотрим на запрос для поиска в папке Документы пользователя fovpc:

$ find ./Документы -user fovpc

В папке ему принадлежат три файла:

Скриншот: Skillbox Media

Поиск по правам пользователя

Файлы можно искать по правам пользователей. Но перед этим предстоит разобраться с тем, как эта система устроена в Linux.

Например, у файла могут быть указаны права 0664 — это соответствует записи -rw-rw-r--. Первые две буквы rw показывают, что пользователь имеет право на чтение и запись файла. Вторые rw означают то же самое для группы пользователей. А запись r- — относится к группе others, которая может только читать, но не перезаписывать файл. Символ -, стоящий в начале и конце строки, а также между указанием на права доступа, является разделителем.

Как расшифровать права, записанные цифрами? Сначала нужно разобрать, что значит каждая из них:

  • 1-я цифра — разрешение на выполнение в качестве программы.
  • 2-я цифра — разрешения для владельца файла.
  • 3-я цифра — разрешения для пользовательской группы.
  • 4-я цифра — разрешения для всех остальных пользователей.

Каждый из показателей может иметь числовое значение от 0 до 7:

Числовое значениеПрава на работу с файломПрава на работу
с директорией
0Нет доступаНет доступа
1ВыполнениеЧтение файлов и их свойств
2ЗаписьНет доступа
3Запись и выполнениеВсё, кроме чтения списка файлов
4ЧтениеЧтение имён файлов
5Чтение и выполнениеДоступ на чтение
6Чтение и записьЧтение имён файлов
7Все праваВсе права

Чтобы найти файлы с определёнными правами, требуется указать их с паттерном
-perm:

$ find . -type f -perm 0664

Файлов в итоговой выдаче получится много:

Список файлов, доступных для чтения и записи пользователю с правами 0664
Скриншот: Skillbox Media

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

  • /u — пользователя;
  • /g — группы;
  • /o — другие.

После этого обозначается, какие именно права доступа мы ищем:

  • r — чтение;
  • w — запись;
  • х — выполнение;
  • X — выполнение, если файл является каталогом или уже имеет аналогичные права для какого-либо пользователя;
  • s — SUID- или SGID-бит;
  • t — sticky-бит. В этом случае только владелец файла и каталога сможет его удалить.

Например, проверим, какие программы, хранящиеся в /usr, пользователь может запускать временно, присваивая себе права другого пользователя, чаще всего их владельца. Они записываются в команду find как /u=s.

Также для доступа к каталогу /usr нам нужно задействовать sudo — параметр повышения привилегий доступа:

$ sudo find /usr -type f -perm /u=s
Список исполняемых файлов, для работы с которыми пользователю временно разрешены повышенные привилегии
Скриншот: Skillbox Media

Поиск по дате модификации

За поиск по дате отвечают паттерны:

  • -mtime — файлы, в которые вносились изменения определённое количество дней назад;
  • -atime — файлы, открытые обозначенное количество дней назад;
  • -cmin — файлы, изменённые определённое количество минут назад.

В примерах ниже мы обращаемся к пути /. Этим символом обозначается главный, корневой каталог, в котором лежат все файлы, в том числе системные. Чтобы find смог получить доступ к содержимому системных папок и найти нужные файлы, мы используем права суперпользователя, добавив sudo перед командой.

Чтобы вывести файлы, изменённые в течение последних 30 дней, используется команда:

$ sudo find / -mtime 30

Если нужно вывести файлы, которые открывали за последние 30 дней, то запрос выглядит так:

$ sudo find / -atime 30

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

$ sudo find / -cmin 30

Поиск можно проводить в промежутке дат. Например, чтобы найти файлы, изменённые в промежутке от 30 до 60 дней, подойдёт такой запрос:

$ sudo find / -mtime +30 -mtime -60

Важно!

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

В нашем случае это файлы, которые редактировались 30 или более дней назад и 60 или менее дней назад.

Попробуем найти файлы, которые были изменены в течение последних 10 дней:

Скриншот: Skillbox Media

Поиск по размеру файла: find size

С помощью find можно найти файлы определённого размера. Для этого используется критерий -size, в который передаётся ограничение по размеру. Для мегабайт используется символ M, для гигабайт — G.

Попробуем найти файлы размером менее 100 МБ:

$ find / -size 100M

Список получился большим и не влез на один экран:

Скриншот: Skillbox Media

Поиск пустых файлов и каталогов

Чтобы найти и вывести информацию о пустых файлах и папках, используется параметр -empty. Найдём пустые папки:

$ find . -type d -empty
Скриншот: Skillbox Media

Если ищем среди файлов, то используем модификатор f:

$ find . -type f -empty
Скриншот: Skillbox Media

Удаление файлов

Если мы хотим удалить найденные папки или файлы, то можем использовать функцию rm внутри запроса в find. Для этого добавляем в него -exec rm -f {}\;. Посмотрим, как это работает.

Например, чтобы удалить все картинки с расширением .jpg из каталога Изображения, используем такой запрос:

$ find ./Изображения –type f –name “*.jpg” –exec rm –f {}\;

Чтобы избиваться от файлов в загрузках объёмом выше 200 МБ:

$ find ./Загрузки –type f –size +200M –exec rm –f {}\;

Это базовые операции с утилитой find. Обратите внимание, что любой запрос получается за счёт комбинации параметров, критериев и шаблонов. Это делает работу с find похожей на сборку конструктора или работу с регулярными выражениями.

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

Научитесь: Администрирова­ние ОС Linux Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована