В 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
Найти в текущем каталоге файлы, измененные позже, чем файл file.bak.
find . -newer file.bak -type f -print
Операторы
Критерии можно объединять, используя операторы. Ниже приведены операторы в порядке убывания их приоритета.
Короткая форма оператора | Длинная форма | Описание |
---|---|---|
! критерий | -not | Отрицание (возвращает true, если критерий false) |
критерий1-a критерий2 | -and | Оператор И (true, если критерий1 и критерий2 true) |
критерий1-o критерий2 | -or | Оператор ИЛИ (true, если критерий1 или критерий2 true) |
В общем случае при использовании операторов критерии проверяются в порядке их приоритета. Изменить порядок можно с помощью скобок. Скобки нужно выделять с помощью обратного слеша.
Примеры использования команды find с использованием операторов
Найти в текущем каталоге файлы, начинающиеся с символа «~» или c «temp» и являющиеся именно обычными файлами (-type f), а не каталогами.
find . \( -name "~*" -or -name "temp*" \) -type f -print
Найти в текущем каталоге (не обрабатывая подкаталоги — -maxdeph 1) обычные файлы (-file f) размером больше 600 мегабайт и менее 1 гигабайта (-size) или файлы имя которых заканчивающиется на «.mpeg» (-name).
find . -maxdepth 1 \( \( -size +600M -and -size -1G \) -or -name "*.mpeg" \) -and -type f
Действия над файлами
Когда выполняется команда find, вы можете выполнять различные действия над найденными файлами. Рассмотрим основные из них.
-exec команда \; | Выполнить команду. Обратите внимание, что после команды ставится обратный слеш и точка с запятой. |
-execdir команда \; | То же самое что и exec, но команда вызывается из подкаталога, содержащего текущий файл. |
-ok команда \; | То же самое, что и exec, но перед обработкой очередного файла будет выводится запрос на выполнение команды. |
-okdir команда \; | То же что ok для execdir. |
Вывод имени файла на экран. | |
-ls | Выполнение команды ls -dils над текущим файлом. |
В выполняемых командах вы можете использовать параметр {} в качестве аргумента, который заменяется путем к текущему файлу.
Примеры использования команды find с использованием действий
Найти в текущем каталоге обычные файлы размером больше 1000 байт и выполнить над ними команду ls -dils (действие ls).
find . -size +1000c -type f -ls
Найти в текущем каталоге обычные файлы, начинающиеся с символа тильда «~», и для каждого файла выдавать запрос на его удаление (на выполнение команды rm).
find . -name "~*" -type f -ok rm {} \;
Заключение
В заметке мы рассмотрели очень важную и полезную Linux команду find, которая предоставляет практически неограниченные возможности для поиска файлов по многим критериям и шаблонам. А с использованием команд (действий) вы можете искать файлы и выполнять над ними любые операции.
Комментарии
22:22
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
15:05
смотри команду сорт, чтобы по-разному сортировать
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
не выводит ничего
13:33
20:20
15:18
14:51
11:28