В 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 | При поиске следовать по символическим ссылкам. |
-maxdepths 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, которая предоставляет практически неограниченные возможности для поиска файлов по многим критериям и шаблонам. А с использованием команд (действий) вы можете искать файлы и выполнять над ними любые операции.
Комментариев нет:
Отправить комментарий