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


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

Эксперт
Галина Артемьева
Инженер во ФГУП «РФЯЦ — ВНИИТФ им. академика Е. И. Забабахина», эксперт Skillbox по кибербезопасности Linux (администрирование ОС Linux).
Утилита find
Find — одна из самых полезных команд Linux для тех, кто работает с сотнями и тысячами файлов на своём компьютере. Например, для системных администраторов. Как можно догадаться из названия, она помогает найти нужные файлы и каталоги, причём не только по их именам.
Команда find имеет определённую структуру:
find [каталог] [параметры] [критерий поиска] [паттерн]
Разберём её по частям:
find — команда запуска поиска.
Каталог — это путь к папке, в которой мы будем что-то искать. Если не задать его вручную, то по умолчанию используется /home/имя_учётной_записи, где хранятся файлы, созданные пользователем.
Параметры — дополнительный критерий поиска. Например, можно искать только файлы или только каталоги.
Критерий поиска — указание на особенности файлов, по которым мы будем их искать: имя, дата создания или расширение.
Паттерн — значение, по которому будут отбираться файлы: их дата изменения, права доступа и так далее.
Практика: пишем запросы в find
Рассмотрим варианты применения утилиты find. Начнём с простого поиска и затем перейдём к настройке критериев поиска и паттернов.
Просто find
При запуске терминала по умолчанию поиск идёт в каталоге /home/имя_учётной_записи. Если вы введёте команду find без дополнительных параметров, то получите список всех файлов, хранящихся в нём:

Скриншот: Skillbox Media
Поиск файлов в определённом каталоге
Откроем папку Документы и посмотрим, какие файлы в ней есть. Для этого используем команду:
$ find ./Документы
У нас в этой папке лежит три документа:

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

Скриншот: Skillbox Media
Команду можно изменить, чтобы искать все файлы, кроме тех, которые содержат слово Озе в имени. Для этого перед -name добавьте -not:
$ find . -not -name “Озе*”
Поиск по расширению
Для того чтобы найти файлы с определённым расширением, к строке поиска добавляется его наименование в двойных кавычках. Например, изображения в формате JPG, можно найти так:
$ find . -name “*.jpg”
Результат поиска:

Скриншот: Skillbox Media
Для поиска можно указать сразу несколько форматов, например .jpg и .webp. Для этого используется команда -o, выполняющая функцию логического оператора ИЛИ:
$ find . -name “*.jpg” -o -name “*.webp”
В результате find найдёт все файлы с расширением .jpg или .webp:

Поиск по типу файла: find file
Find по умолчанию ищет как файлы, так и каталоги. Это не всегда удобно. Чтобы провести поиск только в одной из этих категорий, используйте параметр -type с модификатором:
- d — для каталогов;
- f — для файлов.
Попробуем найти каталог .var. Явно укажем, что ищем именно папку, а не файл с таким именем:
$ find . -type d -name “.var”
Всё получилось:

Теперь попробуем найти файлы с sdk в названии. Укажем это в запросе:
$ find . -type f -name “sdk*”
В ответ получаем один файл sdk.properties:

Поиск с исключением
Если есть несколько форматов файлов, например изображений с озером, можно исключить часть из них. Вернёмся к изображениям со словом «Озеро» в названии и найдём все, кроме тех, что имеют формат .webp.
Для этого используем уже знакомый логический оператор -not, который укажем перед параметром для исключения:
$ find . -name “Озеро*” -not -name “*.webp”
В результате у нас только файлы с расширением .jpg:

Поиск в нескольких каталогах
Иногда файлы, которые требуется найти, находятся не в одном каталоге, а в нескольких. Чтобы не писать команду поиска дважды, можно перечислить папки через пробел.
Найдём все файлы с расширениями .jpg и .docx, которые находятся в каталогах Документы и Изображения. Имена папок указываем после find ., не забывая про символ / перед ними:
$ find . /Документы /Изображения –type f –name “*.jpg” –o –name “*.docx”
В ответ получаем список файлов в двух каталогах:

Файлы, принадлежащие пользователю
Чтобы найти файлы, принадлежащие конкретному пользователю, можно применить одну из двух команд:
$ find . -user имя_пользователя
или
$ find ./Документы -user имя_пользователя
Второй вариант подойдёт для поиска в конкретном каталоге.
Эти же команды можно применять для групп пользователей. Достаточно заменить параметр -user на -group.
Посмотрим на запрос для поиска в папке Документы пользователя fovpc:
$ find ./Документы -user fovpc
В папке ему принадлежат три файла:

Поиск по правам пользователя
Файлы можно искать по правам пользователей. Но перед этим предстоит разобраться с тем, как эта система устроена в 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
Файлов в итоговой выдаче получится много:

Скриншот: 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 дней:

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

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

Если ищем среди файлов, то используем модификатор f:
$ find . -type f -empty

Удаление файлов
Если мы хотим удалить найденные папки или файлы, то можем использовать функцию 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 похожей на сборку конструктора или работу с регулярными выражениями.
Если вы хотите погрузиться в возможности утилиты глубже и научиться настраивать выдачу результатов, используя все возможности параметров и критериев, то рекомендуем вам официальную документацию.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!