20 супер полезных примеров команды find в Linux

Команда find в Linux — это мощный инструмент для поиска файлов и директорий. Широкий ассортимент критериев поиска делают данную команду особенно эффективной.

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

Благодаря своей гибкости и богатому функционалу, find позволяет решать широкий спектр задач — от поиска по имени и типу файла до выполнения команд над найденными объектами.

Команда find: базовое использование

Самый базовый формат команды выглядит так:

find [где] [фильтр] [значение фильтра]

[где]  — директория, в которой проводится поиск
[фильтр] — параметр по которому будет отобран вывод
[значение фильтра] – значение фильтра, по которому осуществляется отбор

Если выполнить команду find без каких либо дополнительных аргументов, мы получим список всех директорий и файлов в текущей папке:

[root@waky example]# find
.
./dir1
./dir1/test
./dir2
./dir2/test
./test.txt
./test
./Test
[root@waky example]#

Так как не задано [где]  проводить поиск, по умолчанию используется текущая директория. А если не задан [фильтр], то любой файл или папка соответствуют условиям поиска.

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

В примерах поиск будет осуществляться внутри директории example. В таком случае можно использовать  поиск без задания директории, но для наглядности буду использовать указание на текущую директорию (./). 

Используя примеры на практике, достаточно заменить использование текущей директории, на путь до реального места поиска (например, /var/log/).

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

-name данный параметр служит для отбора результатов поиска по имени

[root@waky example]# find ./ -name test
./dir1/test
./dir2/test
./test
[root@waky example]#

В выводе отсутствуют директории ./dir1 и ./dir2, что очевидно, но так же отсутствуют файлы ./test.txt и ./Test. У директорий название не имеет ничего общего с test, поэтому они исключены из результатов поиска.

Файл ./test.txt не попал в выдачу, так как у него есть лишняя (.txt) часть в названии. А ./Test  исключен потому, что Linux регистрозависимая система, в которой заглавная и прописная буквы не равны.

2. Поиск по имени без учета регистра

-iname служит для поиска по имени, но без учета регистра символов

[root@waky example]# find ./ -iname test
./dir1/test
./dir2/test
./test
./Test
[root@waky example]#

В отличие от предыдущего примера, в вывод попал файл ./Test, так как при регистронезависимом поиске find не разделяет t и T.

3. Поиск по части имени

* в Linux имеет значение любой

[root@waky example]# find ./ -name "test*"
./dir1/test
./dir2/test
./test.txt
./test
./testfile
[root@waky example]# 

Поиск покажет все файлы и папки, в название которых первые четыре символа test, а дальше любое (в том числе и нулевое) количество любых символов.

4. Поиск файлов по расширению

В Linux расширение – такая же часть имени файла, как и само название. Поэтому * активно используют для поиска всех файлов одного типа.

[root@waky example]# find ./ -name "*.txt"
./test.txt
./file.txt
[root@waky example]#

Поисковый вывод содержит все текстовые файлы с расширением .txt

5. Поиск по типу файл/директория

-type параметр ограничивает поиск, исключая из него лишний тип

[root@waky example]# find ./ -type d
./
./dir1
./dir2
./dir2/test
[root@waky example]#

Аргумент d означает директории, поэтому поиск вернул только их.

[root@waky example]# find ./ -type f
./dir1/test
./test.txt
./test
./Test
./testfile
./file.txt
[root@waky example]#

Аргумент f отвечает за файлы, результат поиска содержит только файлы.

[root@waky example]# find ./ -type l
./link_Test
[root@waky example]#

Для поиска ссылок используется тип l.

6. Поиск файлов и директорий по размеру

-size отвечает за поиск по размеру

Аргумент  для параметра -size состоит из двух частей – число (со знаком или без) и буква (единица измерения).

Единицы измерения могут быть:

  • c – байты
  • k – килобайты
  • M – мегабайты
  • G – гигабайты

Число может задаваться как:

  • -n – меньше n
  • n – ровно n
  • +n – больше n
[root@waky example]# find ./ -size 5M
./5mb_file 
[root@waky example]#

Найдет все файлы размером 5 Мб.

Использование знака + означает больше заданного значения.

[root@waky example]# find ./ -size +5M
./10mb_file
[root@waky example]#

Результат поиска содержит только файлы больше 5 Мб.

Знак означает меньше заданного значения.

[root@waky example]# find ./ -size -5M
./
./dir1
./dir1/test
./dir2
./dir2/test
./test.txt
./test
./Test
./testfile
./file.txt

Выведет все файлы меньше 5 Мб.

7. Поиск пустых файлов и директорий

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

[root@waky example]# find ./ -size 0
./dir1/test
./test.txt
./test
./Test
./testfile
./file.txt
[root@waky example]#

Но команда find имеет отдельный параметр для отбора пустых объектов.

-empty используется для поиска пустых файлов и директорий

[root@waky example]# find ./ -empty
./dir1/test
./dir2/test
./test.txt
./test
./testfile
./file.txt
./Test
[root@waky example]#

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

-mtime параметр используемый для отсева результатов поиска по времени последней модификации

[root@waky example]# find ./ -mtime -1
./
./dir1
./dir1/test
./dir2
./dir2/test
./test.txt
./test
./testfile
./file.txt
./10mb_file
./5mb_file
./Test
[root@waky example]#

Найти все директории и файла, менявшиеся за последние сутки (-1).

[root@waky example]# find ./ -mtime +1
[root@waky example]#

Покажет объекты, которые менялись более суток назад (+1).

-ctime проводит поиск по времени создания

[root@waky example]# find ./ -ctime -1
./
./test.txt
./testfile
./file.txt
./test
./link_Test
[root@waky example]#

В результатах поиска объекты, созданные меньше чем за день (-1).

-atime проводит фильтрацию по времени последнего доступа

[root@waky example]# find ./ -atime 1
./dir1/test
./test.txt
./testfile
./file.txt
./10mb_file
./5mb_file
./Test
[root@waky example]#

Покажет объекты, к которым последний раз обращались ровно день назад (1).

Параметры -mtime, -ctime и -atime принимают в качестве аргументов дни. Есть аналогичные параметры, но исчисляющие время в минутах. -mmin-cmin и -amin отвечают за время последней модификации, создания и обращения соответственно.

[root@waky example]# find ./ -amin -1
./
./Test
[root@waky example]#

Покажет, к каким объектам было обращение меньше минуты назад (-1).

9. Поиск старых логов

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

[root@waky example]# find /var/log -type f -name "*.log" -mtime +30
/var/log/audit/audit.log
/var/log/nginx/access.log
[root@waky example]#

Вывод содержит файлы (-type f) с расширением .log (-name “*.log”) которые изменялись более 30 (-mtime +30) дней назад.

10. Поиск файлов и директорий с определенными правами доступа

-perm помогает найти все объекты с определенным набором доступов

Доступы могут иметь буквенное обозначение:

[root@waky example]# find ./ -perm -o=x
./
./dir1
./dir2
./dir2/test
./testfile
[root@waky example]# 

Результаты поиска содержат все файлы и директории, для которых пользователи из категории другие (-o) имеют право исполнения (x).

[root@waky example]# find ./ -not -perm -g=r
./test.txt
[root@waky example]# 

Получим файлы и директории, для которых пользователи из группы (-g) не (-not) имеют права чтения (r).

Или доступы могут задаваться численным способом:

[root@waky example]# find ./ -perm 600
./test.txt
[root@waky example]#

Вывод содержит все объекты у которых только владелиц имеет права чтение и запись (6), а группа и остальные не имеют доступа (0).

11. Поиск файлов по владельцу или группе

-user позволяет проводить поиск по владельцу

[root@waky example]# find ./ -user nginx
./file.txt
[root@waky example]# 

Найдет все файлы и директории принадлежащие пользователю nginx (-user nginx).

-group поиск по группе

[root@waky example]# find ./ -group nginx
./file.txt
[root@waky example]#

Покажет все файлы и директории принадлежащие группе nginx (-group nginx).

12. Поиск по именам в пути файлов и директорий

-path результат поиска будет содержать только те объекты, в пути которых содержится заданная директория

[root@waky example]# find ./ -path "./dir1/*"
./dir1/test
[root@waky example]#

Выведет только те файлы и папки, в пути которых есть директория dir1.

[root@waky example]# find ./ -path "./dir*/*"
./dir1/test
./dir2/test
[root@waky example]#

Выведет объекты, в пути которых есть директории с dir в начале имени.

13. Исключение директорий из поиска

Используем задание пути и отрицание для исключения директорий из результатов поиска.

[root@waky example]# find ./ -name "test"
./dir1/test
./dir2/test
./test
[root@waky example]#

Найдет все файлы и папки с именем test.

[root@waky example]# find ./ -not -path "./dir1/*" -name "test"
./dir2/test
./test
[root@waky example]#

Результаты поиска содержат объекты, путь которых не содержит (-not -path “./dir1/*”) указанной директории.

Можно исключить сразу несколько директорий.

[root@waky example]# find ./ -not -path "./dir1/*" -not -path "./dir2/*" -name "test"
./test
[root@waky example]#

Кроме первой директории, исключили и вторую (-not -path “./dir2/*”).

14. Поиск в нескольких директориях одновременно

Если нужно провести один и тот же поиск в нескольких невложенных директориях это можно сделать в одной команде. Достаточно последовательно перечислить желаемые директории.

[root@waky example]# find ./dir1 ./dir2 -name test
./dir1/test
./dir2/test
[root@waky example]#

Поиск пройдет в том же порядке, сначала в директории ./dir1 а потом в ./dir2.

15. Изменение глубины поиск

-maxdepth позволяет регулировать глубину вложенного поиска

По умолчанию команда find ищет в заданной директории и во всех вложенных директориях. Поиск проходит по всем папкам независимо от глубины вложения.

[root@waky example]# find ./ -name test
./dir1/test
./dir2/test
./test
[root@waky example]#

Поиск нашел все возможные варианты, как в заданной папке, так и во вложенных.

[root@waky example]# find ./ -maxdepth 1 -name test
./test
[root@waky example]#

Результаты поиска содержат только файл из текущей директории, так как глубина (-maxdepth) указывает на первый (1) уровень вложения.

[root@waky example]# find ./ -maxdepth 2 -name test
./dir1/test
./dir2/test
./test
[root@waky example]#

Со вторым уровнем вложения (-maxdepth 2) поиск проверяет заданную директорию, и по одному уровню вложения в директориях, находящихся в заданной.

16. Поиск по нескольким параметрам одновременно

Одно из основных преимуществ команды find – возможность сочетать несколько поисковых фильтров одновременно.

[root@waky example]# find ./ -name "test*" -perm 755
./dir2/test
./testfile
[root@waky example]#

Результат поиска содержит все файлы и директории с test (-name “test*”) в начале названия и с набором прав 755 (-perm 755).

[root@waky example]# find ./ -name "test*" -perm 755 -type d
./dir2/test
[root@waky example]#

Все то же самое, что и в прошлый раз, но вывод содержит только директории (-type d).

[root@waky example]# find ./ -type f -iname "test" -empty
./dir1/test
./Test
[root@waky example]#

Найдет все пустые (-empty) файлы (-type f) с именем test в независимости от регистра (-iname “test”).

[root@waky example]# find ./ -type f -iname "test" -not -empty
./test
[root@waky example]#

То же, что и в прошлый раз, но файлы не пустые (-not -empty).

[root@waky example]# find /var/log -type f -name "*.log" -mtime +30 -size +5M
/var/log/audit/audit.log
[root@waky example]#

Поиск всех файлов (-type f) логов (-name “*.log”) старше 30 дней (-mtime +30) и размером больше 5 Мб (-size +5M).

17. Выполнение команд над найденными файлами встроенными средствами (-exec)

Второе преимущество команды find – возможность выполнения действий непосредственно над объектами из результатов поиска.

-exec  служит для выполнения действий над файлами и директориями, полученными в результате поиска.

Команда, которую мы хотим выполнить над найденными объектами пишется через пробел после  -exec и закрывается ( {} +). Обратите особое внимание на наличие пробелов между символами.

[root@waky example]# find ./ -type f -name "*.txt" -exec ls -l {} +
-rw-r--r-- 1 root root 0 May 21 11:32 ./file.txt
-rw------- 1 root root 0 May 21 10:03 ./test.txt
[root@waky example]#

Поиск найдет все файлы (-type f) с расширением txt (-name “*.txt”) и выполнит над ними команду ls -l (-exec ls -l {} +).

[root@waky example]# find ./ -type f -name "*.txt" -exec chmod a+r {} +
[root@waky example]# find ./ -type f -name "*.txt" -exec ls -l {} +
-rw-r--r-- 1 root root 0 May 21 11:32 ./file.txt
-rw-r--r-- 1 root root 0 May 21 10:03 ./test.txt
[root@waky example]#

Первой командой, к файлам найденным по тем же параметрам добавляем для всех возможность чтения (-exec chmod a+r {} +). А второй командой проверяем обновлённые доступы для того же набора файлов.

18. Выполнение команд над найденными файлами отдельным инструментом (xargs)

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

xargs задает файлы и директории найденные командой find как объект воздействия следующей команды.

[root@waky example]# find ./ -type f -name "*.txt" | xargs chmod 600
[root@waky example]# find ./ -type f -name "*.txt" | xargs ls -l
-rw------- 1 root root 0 May 21 11:32 ./file.txt
-rw------- 1 root root 0 May 21 10:03 ./test.txt
[root@waky example]#

Первой строкой мы находим все файлы (-type f) с .txt на конце (-name “*.txt”) и применяем (| xargs)к ним команду (chmod 600). Второй строкой, к тому же набору файлов применяем вывод подробной информации (ls -l). Будьте внимательны с пробелами.

[root@waky example]# find ./ -not -iname "test*" -size +2M | xargs du -sh
10M     ./10mb_file
5.0M    ./5mb_file
[root@waky example]#

Поиск файлов и папок, имена которых не (-not) начинаются с test вне зависимости от регистра (-iname “test*”), а размер больше 2 Мб (-size +2M). Вывод размера найденного объекта с помощью отдельной команды (du -sh).

19. Использование в поиске регулярных выражений (-regex, -iregex)

-regex позволяет проверить результаты поиска на соответствие регулярному выражению

[root@waky example]# find ./ -regex "./[0-9a-z]+_[o-9a-z]+"
./10mb_file
./5mb_file
[root@waky example]#

Найдет все файлы и директории, название которых состоит из двух частей разделенных нижним подчеркиванием (_), каждая часть содержит один или более (+) символ из набора букв и цифр ([o-9a-z]).

Обратите внимание, что в начале ставится знак текущей директории (./), так как в поисковой выдаче файлы показаны именно в таком формате.

-iregex регистронезависимый вариант -regex

[root@waky example]# find ./ -iregex "./[0-9a-z]+_[o-9a-z]+"
./10mb_file
./5mb_file
./link_Test
[root@waky example]#

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

20. Комбинирование условий поиска (логические операторы)

-o параметр соответствующий логическому или, позволяет фильтровать по одному из условий

[root@waky example]# find ./ -name "*.txt" -o -name "*_file"
./test.txt
./file.txt
./10mb_file
./5mb_file
[root@waky example]#

Результат поиска содержит объекты, у которых название заканчивается на .txt (-name “*.txt”) или (-o) на _file (-name “*_file”).

[root@waky example]# find ./ -iname "test" -empty -o -type f -size +5M
./dir1/test
./dir2/test
./10mb_file
./Test
[root@waky example]#

Найдет пустые (-empty) директории и файлы с именем test вне зависимости от регистра (-iname “test”) или файлы (-type f) больше 5 Мб(-size +5M).

Заключение

Команда find — это универсальный инструмент, который значительно упрощает работу с файлами в Linux-системах.

В этой статье мы рассмотрели 20 наиболее полезных примеров использования команды: от простого поиска по имени до сложных условий с использованием регулярных выражений и автоматического выполнения команд над найденными объектами.

Знание возможностей find позволяет не только ускорить рутинные задачи, но и автоматизировать управление файлами, повышая вашу эффективность как администратора.