Команда find: широкие возможности для поиска файлов в Linux

Команда find в LinuxВ Linux есть очень мощная и полезная команда для поиска файлов — команда find. Она обладает большим количеством возможностей для поиска файлов, однако, иногда вызывает сложности у новичков во многом из-за ее синтаксиса.

Простой пример использования команды find

Для начала рассмотрим простой пример использования команды find для поиска на компьютере файлов с именем config. Мы будем искать файлы config, начиная с корневого каталога /. Для этого вам нужно выполнять команду от имени пользователя root, чтобы иметь достаточно прав доступа, иначе получите сообщения «Permission denied». Итак, выполним команду:

find / -name config -print

Команда означает следующее: искать файлы с именем config (-name config), начиная с каталога / (первый параметр команды find) и выводить имена файлов на экран (аргумент -print). Отмечу, что поиск рекурсивный, то есть при поиске просматриваются все вложенные директории. Как видите все просто. Теперь рассмотрим синтаксис команды и перейдем к обзору ее основных аргументов.

Синтаксис команды find

Общий синтаксис команды find, который вы можете найти в справочном руководстве, может показаться не совсем простым, поэтому я приведу более удобный для восприятия:

find [путь] [опции] [критерии поиска] [действия над файлами]

Путь

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

Опции

Опции команды find указываются, начиная с символа «-», за которым следует название опции. Рассмотрим основные опции.

-depth (или -d)Поиск в подкаталогах перед поиском в самом каталоге.
-LПри поиске следовать по символическим ссылкам.
-maxdepth NПри поиске проверять не более чем N вложенных уровней каталогов.
-mindepth NНе проверять вложенные каталоги уровня N и меньше.
-mountНе искать в каталогах других файловых систем.

Критерии поиска

У команды find может быть несколько критериев поиска (их также называют tests). Каждый критерий представляет собой определенное условие проверки, которое возвращает либо true либо false. Это можно сравнить с условиями оператора if в программировании. В процессе обработки очередного файла команда find по очереди проверяет каждый критерий, и если очередной критерий возвращает false, тогда команда find переходит к следующему файлу. Критериев у команды find довольно много, мы рассмотрим только некоторые из них.

-atime NПоследний раз к файлу обращались N дней назад.
-mtime NПоследнее изменение файла было N дней назад.
-name шаблонИмя файла (шаблон имени) без указания пути. Рекомендуется всегда заключать шаблон в кавычки.
-newer другой_файлФайл был изменен позже, чем другой_файл.
-size [±]N[cwbkMG]Размер файла равен N блокам, если указано +N, тогда размер файла больше N, -N — меньше. Символ после N означает размер блока. b — 512 байт, с — байт, w — 2 байта, k — килобайт, M — мегабайт, G — гигабайт.
-type CФайл типа C. Наиболее часто используемые значения для С: d — каталог, f — файл.
-user Имя_пользователяФайл принадлежит пользователю с именем Имя_пользователя.

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

find . -type f -name "~*" -print

Найти в текущем каталоге обычные файлы (не каталоги), имя которых начинается с символа «~».

find . -newer file.bak -type f -print

Найти в текущем каталоге файлы, измененные позже, чем файл file.bak.

Операторы

Критерии можно объединять, используя операторы. Ниже приведены операторы в порядке убывания их приоритета.

Короткая форма оператораДлинная формаОписание
! критерий-notОтрицание (возвращает true, если критерий false)
критерий1-a критерий2-andОператор И (true, если критерий1 и критерий2 true)
критерий1-o критерий2-orОператор ИЛИ (true, если критерий1 или критерий2 true)

В общем случае при использовании операторов критерии проверяются в порядке их приоритета. Изменить порядок можно с помощью скобок. Скобки нужно выделять с помощью обратного слеша.

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

find . \( -name "~*" -or -name "temp*" \) -type f -print

Найти в текущем каталоге файлы, начинающиеся с символа «~» или c «temp» и являющиеся именно обычными файлами (-type f), а не каталогами.

find . -maxdepth 1 \( \( -size +600M -and -size -1G \) -or -name "*.mpeg" \) -and -type f

Найти в текущем каталоге (не обрабатывая подкаталоги — -maxdeph 1) обычные файлы (-file f) размером больше 600 мегабайт и менее 1 гигабайта (-size) или файлы имя которых заканчивающиется на «.mpeg» (-name).

Действия над файлами

Когда выполняется команда find, вы можете выполнять различные действия над найденными файлами. Рассмотрим основные из них.

-exec команда \;Выполнить команду. Обратите внимание, что после команды ставится обратный слеш и точка с запятой.
-execdir команда \;То же самое что и exec, но команда вызывается из подкаталога, содержащего текущий файл.
-ok команда \;То же самое, что и exec, но перед обработкой очередного файла будет выводится запрос на выполнение команды.
-okdir команда \;То же что ok для execdir.
-printВывод имени файла на экран.
-lsВыполнение команды ls -dils над текущим файлом.

В выполняемых командах вы можете использовать параметр {} в качестве аргумента, который заменяется путем к текущему файлу.

Примеры использования команды find с использованием действий

find . -size +1000c -type f -ls

Найти в текущем каталоге обычные файлы размером больше 1000 байт и выполнить над ними команду ls -dils (действие ls).

find . -name "~*" -type f -ok rm {} \;

Найти в текущем каталоге обычные файлы, начинающиеся с символа тильда «~», и для каждого файла выдавать запрос на его удаление (на выполнение команды rm).

Заключение

В заметке мы рассмотрели очень важную и полезную Linux команду find, которая предоставляет практически неограниченные возможности для поиска файлов по многим критериям и шаблонам. А с использованием команд (действий) вы можете искать файлы и выполнять над ними любые операции.

01.09.2009yuriy7

Комментарии

Вячеслав
15.09.2010, 22:22
Привет. А как быть на солярисе с ограничением вложений- не пониает maxdepth и mindepth
vvv
02.12.2012, 14:09
как упорядочить вывод найденных фалов по имени или дате изменений?
вывод получается хаотичным:
cd /home/user/catalog
find -name "*.doc"
./12.06.doc
./2.doc
./1.doc
./11.03.doc
./12.02.doc
./11.12.doc
./11.02.doc
./11.10.doc
Alex
02.02.2013, 15:05
VVV, может быть так: find -name '*.doc' | sort
смотри команду сорт, чтобы по-разному сортировать
Александр
25.02.2013, 22:04
а как же так?
server:~$ sudo ls -lh /media/raid_public/2Tb-avreg-all/2012-12/02/01-cam1/18_03_2*
-rw-r--r-- 1 root root 323K 2012-12-02 20:44 /media/raid_public/2Tb-avreg-all/2012-12/02/01-cam1/18_03_27.avi
-rw-r--r-- 1 root root 26K 2012-12-02 20:44 /media/raid_public/2Tb-avreg-all/2012-12/02/01-cam1/18_03_29-02.jpg

при этом:
server:~$ sudo find /media/raid_public/2Tb-avreg-all/2012-12/02/01-cam1/18_03_2* -type f -size -1M -ls
не выводит ничего
Nird
01.08.2013, 13:33
Не плохая статья, спасибо. Забыли про критерий -prune - искать только в текущем каталоге не переходя глубже.
Николай
18.03.2014, 20:20
Здравствуйте, статья очень хорошая. Спасибо. Но у меня возник вопрос, как мне использовать эту команду если я хочу найти файлы размером, например, 1 мб? Или эта команда здесь не поможет?
666
30.12.2014, 15:18
и толку? в консоль выводится список всех файлов на диске и ошибки отсутствия доступа к системным папкам. найти в этом списке нужный файл не представляется возможным.

Написать комментарий

Ваше имя:
Текст:
Вы не зарегистрированы: комментарий будет опубликован только после просмотра администратором сайта.