Команда find в Linux — это мощный инструмент для поиска файлов и директорий. Широкий ассортимент критериев поиска делают данную команду особенно эффективной.
Она незаменима для системных администраторов и разработчиков, но будет полезна и рядовым пользователям, когда надо упростить и ускорить работу с большим количеством файлов в сложных структурах каталогов.
Благодаря своей гибкости и богатому функционалу, find позволяет решать широкий спектр задач — от поиска по имени и типу файла до выполнения команд над найденными объектами.
- Команда find: базовое использование
- Поиск файлов и директорий по имени
- Поиск по имени без учета регистра
- Поиск по части имени
- Поиск файлов по расширению
- Поиск по типу файл/директория
- Поиск файлов и директорий по размеру
- Поиск пустых файлов и директорий
- Поиск файлов и директорий по времени
- Поиск старых логов
- Поиск файлов и директорий с определенными правами доступа
- Поиск файлов по владельцу или группе
- Поиск по именам в пути файлов и директорий
- Исключение директорий из поиска
- Поиск в нескольких директориях одновременно
- Изменение глубины поиска
- Поиск по нескольким параметрам одновременно
- Выполнение команд над найденными файлами встроенными средствами (-exec)
- Выполнение команд над найденными файлами отдельным инструментом (xargs)
- Использование в поиске регулярных выражений (-regex, -iregex)
- Комбинирование условий поиска (логические операторы)
Команда 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 позволяет не только ускорить рутинные задачи, но и автоматизировать управление файлами, повышая вашу эффективность как администратора.