Читайте, как найти файлы и папки в Linux с помощью команды find, как применять опции find для поиска по названию, содержимому, дате создания, изменения, последнего обращения и многим другим параметрам.
Часто быстрый поиск нужной информации — критически важная задача. Это можно сделать через любой файловый менеджер. Все файловые менеджеры обладают теми или иными стандартными возможностями, но с расширенными функциями, которые предлагает терминал, они всё же не могут сравниться.
Как найти файл через терминал? Какие инструменты командной строки существуют для более точного, выборочного поиска по файловой системе? Как искать по содержимому? Ответы на эти вопросы вы найдёте в этом материале.
Как найти файл в Linux с инструментом find
Чаще всего для поиска по метаданным используют утилиту find, которая умеет искать объекты (в том числе файлы и папки) по нескольким атрибутам:
- по наименованию;
- по дате создания, внесения изменений, последнего доступа;
- по содержимому (пустые) и по другим критериям.
Этот инструмент полезен для обычных пользователей, но также он незаменим для сисадминов, так как упрощает процесс администрирования, проведения бекапов и других операций.
Кроме того, Linux-утилита find не только ищет объекты, опираясь на указанные признаки, но и даёт возможность одновременно с поиском задать действия, которые нужно применить по отношению к результатам.
Синтаксис инструмента find
Общий вид запроса:
$ find <путь_или_директория> <критерий> <действие>
Где:
- <путь_или_директория> — каталог; поиск будет произведён в нём и во всех дочерних папках; если путь не указан, то команда будет применена к текущему каталогу;
- <критерий> — признак, которому должен соответствовать искомый файл или каталог — обычно это атрибут или характер содержимого;
- <действие> — то действие, которое нужно произвести с найденными объектами.
Как найти файл по имени
По полному наименованию
Для поиска по имени вводим в командной строке и жмём Enter:
$ find . -name <table.xyz>
Вывод:
./table.xyz
В приведённом примере:
- . (точка) — указывает на директорию поиска, а именно на то, что он будет проходить в текущей папке;
- -name — критерий; у нас — по имени файла;
- <table.xyz> — имя искомого файла, включая расширение.
Обратите внимание!
Поиск по признаку «-name» чувствителен к регистру, в нашем случае ему будут соответствовать только символы нижнего регистра, поэтому файл с именем Table.xyz не попадёт в результаты.
Чтобы игнорировать регистр, нужно использовать похожую опцию «-iname»:
$ find . -iname <text.xyz>
В выводе увидим:
./text.xyz
./Text.xyz
По расширению
Чтобы найти все файлы определённого формата, вместе с «-name» используют специальные шаблоны «*.webp», «*.docx» и т. п.:
Например:
$ find . -name <*.webp>
В выводе будет список всех webp-файлов, лежащих в текущем каталоге и во всех подкаталогах:
./foto.webp
./flowers.webp
./picture1.webp
./picture2.webp
./MyFotoes/foto1.webp
./MyFotoes/foto2.webp
Поиск в определённой директории
В поисковый запрос можно добавить директорию. Приведём поисковый запрос для всех текстовых документов формата docx в папке Books:
$ find /Books -name <*.docx>
Пример вывода с перечислением подошедших под условия файлов:
find: `/Books/directory1/.cache': Permission denied
/Books/English/Catcher in the Rye.docx
/Books/English/Oliver Twist Dickens Charles.docx
/Books/Spanish/Don Quizote de la Mancha.docx
По различным причинам доступ к каталогам может быть запрещён, тогда мы увидим в выводе подобную строку или строки:
find: `/Books/directory1/.cache': Permission denied
Если ошибок, связанных с запретом доступа, слишком много и они мешают формированию итогового списка, то добавьте в конец поискового запроса следующее:
2>/dev/null
Благодаря этому сообщения с отказами доступа будут перенаправлены по пути dev/null и будут исключены из результатов:
$ find /Movies -name <*.avi> 2>/dev/null
Вывод уже не будет содержать сообщения Permission denied:
/Movies/Deadpool & Wolverine.avi
/Movies/Venom: The Last Dance.avi
/Movies/The Lord of the Rings: The Return of the King.avi
По типу искомого объекта
Дополнительный флаг «-type» производит поиск по типу объекта, для которых применяются следующие обозначения:
- f — файлы;
- d — папки;
- l — символьные ссылки;
- b — блочные устройства;
- c — символьные устройства;
- p — именованный конвейер;
- s — сокет.
То есть, если ввести дополнительное условие «-type d», то в выводе будет список из текущей и вложенных папок:
$ find /Fotoes -type d
/Fotoes
/Fotoes/2020-2022
/Fotoes/2023
/Fotoes/2024
По размеру
Для поиска по размеру применяют флаг «-size», затем указывают размер искомых объектов. Если нужны объекты больше указанного размера, добавляют знак «плюс» (+), меньшего размера — знак «минус» (-). При отсутствии знака утилита будет искать объекты, объём которых точно совпадает с указанным.
Например, так будет выглядеть поиск файлов более 500 MБ (+500 M):
$ find . -size +500 M
./Windowsx64_Installer.iso
./arch.rar
Приведём здесь обозначения объёма, которые используются в командах:
- c — байты;
- k — килобайты;
- M — мегабайты;
- G — гигабайты.
Как найти пустые объекты (с пустым содержимым)
Сделать это можно, добавив флаг «-empty», что значит «пустой». Команда «-empty» ищет и пустые папки, и файлы:
$ find . -empty
По периоду последней модификации (в минутах)
Чтобы найти объекты, изменённые в указанный промежуток времени (сюда же входит и создание), в дополнение к «find» вводят опции «-cmin» «-amin» и «-mmin», которые позволяют производить поиск по времени последних действий (в минутах). К примеру, если нужен список объектов с измененными метаданными за предыдущие полчаса (30 минут), к команде добавляют «-cmin -30»:
$ find . -cmin -30
.
./name01.txt
./name02.txt
Этим способом ищут все изменённые или созданные за предшествующие полчаса объекты в текущем и вложенных каталогах.
Указанный критерий можно использовать и в обратном направлении: для поиска объектов, изменённых ранее указанного времени. Например, чтобы найти объекты, изменённые в любое время, кроме предшествующих 30 минут, в командной строке вводят:
$ find . -cmin +30
Также можно применять следующие запросы:
- По периоду последнего обращения или access time (здесь — менее получаса назад):
$ find ./ -amin -30
- По периоду последней модификации или создания (менее получаса назад):
$ find ./ -mmin -30
По времени последнего обращения или изменения (в днях)
Чтобы найти объекты, которые открывали (или не открывали) в течение определённого промежутка времени, указанного в днях, вводят флаг «-atime», который также используется со знаками «плюс» или «минус». Например, чтобы найти файлы и папки, которые не открывались в течение последнего месяца, задают следующие условия:
$ find . -atime +30
А чтобы получить файлы, наоборот, открытые последний раз за предшествующие 30 дней, добавляют «-atime -30».
Другие варианты:
- По периоду последнего изменения владельца или прав доступа в днях:
-ctime
- По периоду последней модификации или создания:
-mtime
Ищем файлы с привязкой к дате создания, изменения или обращения
Искать можно и с привязкой к точной дате и времени. Для этого используют опции «-newermt» и «-newerat».
- По созданию или модификации; будут найдены объекты, изменённые после указанной даты и времени:
find ./ -newermt "2024-08-13 12:00"
- По последнему обращению, также после указанной даты:
find ./ -newerat 2024-08-10
- С привязкой ко времени создания или модификации другого файла:
find ./ -newer /docs/agreement
По принадлежности (владельцу)
Если необходимо найти объекты, принадлежащие определённому пользователю, то добавляют «-user», после чего указывают имя пользователя. В примере будем вести поиск в папке Directory1, имя владельца — Admin, в конце пропишем «2>/dev/null», чтобы выдача содержала чистый список:
$ find /Directory1 -user Admin 2>/dev/null
По присвоенным разрешениям
Для поиска по установленным правам доступа вводят «-perm», после чего добавляют три цифры разрешений. Напомним, что первая цифра обозначает уровень доступа владельца, вторая — уровень доступа группы и третья — права всех остальных пользователей.
$ find /directory01 -perm 644
В примере будет производиться поиск файлов со стандартными разрешениями 644 в директории /directory01.
Как объединять условия поиска
Чтобы вести поиск по сочетанию признаков, используют специальные операторы:
- -and — в результат попадут только объекты, имеющие оба указанных признака;
- -or — оператор «или» — по одному из указанных критериев;
- -not — оператор исключит из результатов те файлы и папки, которые соответствуют указанному вторым критерию.
Например, чтобы в /documents найти файлы пользователя Admin, объёмом превышающие 500 мегабайт, нужно ввести в командной строке:
$ find /documents -user Admin -and -size +500M
Можно применять и несколько операторов одновременно, в этом случае блоки отделяются друг от друга символами обратный слеш и скобка «\(» и «\)» без кавычек. Например, найдём файлы, принадлежащие одному из двух пользователей Admin и Sasha, объёмом превышающие 500 мегабайт:
$ find /documents \( -user Admin -or -user Sasha \) -and -size +500M
Как задать действия
После «find» можно прописать дополнительные действия, которые нужно произвести с найденными объектами:
Применяемые команды
- -delete — удаление всех соответствующих критериям объектов;
- -ls — выведет расширенные результаты поиска с указанием размеров и inode (Index Node);
- -print — выводит список найденных объектов с указанием полного пути; выполняется по умолчанию, если не задано какое-либо другое действие;
- -exec — с её помощью задают ещё одно действие для каждой строки результатов поиска; не выводит подтверждение действия;
- -ok — похож на «-exec», но после выполнения выводит подтверждение;
- и другие.
Примеры использования команд
-delete
Удаление всех файлов и папок с пустым содержимым в текущей директории:
$ find . -empty -delete
Однако до запуска команды с удалением рекомендуется запустить «find -empty» без дополнительного «-delete» — для вывода результата и подстраховки.
-exec
Синтаксис:
-exec <command> {} \;
- Здесь <command> — это действие, которое будет произведено;
- {} — обозначает результаты поиска;
- \; — символ обратного слеша в сочетании с точкой с запятой обозначает конец команды.
К примеру, «-exec» позволяет удалить результаты поиска альтернативным способом:
$ find . -empty -exec rm {} \;
Ещё один вариант применения «-exec»:
$ find . -name "*.odt" -exec cp {} /Docs/2024 \;
В приведённом примере будут скопированы все файлы с расширением .odt в целевой каталог /Docs/2024.
Подведём итоги
Итак, лучшее решение для поиска по файлам Linux — утилита «find». С ней доступны разнообразные параметры поиска по:
- наименованию файла (включая расширение) или каталога;
- дате и времени создания, модификации или последнего обращения;
- принадлежности файла или каталога.
- объёму;
- установленным правам, а также по другим критериям.
Важно, что ещё до начала поиска можно указать действия, которые нужно произвести с найденными объектами, например, удалить их, скопировать, переместить и другие.
Читайте полезные материалы: