Содержание материала
- Формат команды find
- Видео
- Найти и скопировать
- Найти файлы по типу
- Найти файлы по разрешениям
- Найти файлы по владельцу
- Критерии
- Синтаксис команды find
- Путь
- Опции
- Критерии поиска
- Примеры использования команды find с использованием критериев
- Операторы
- Примеры использования команды find с использованием операторов
- Действия над файлами
- Примеры использования команды find с использованием действий
- Основные опции команды find
- Поиск файлов по дате изменения
- -prune: ограничить глубину
- Чистка по расписанию
Формат команды find
В общем виде команда find выглядит следующим образом:
где путь – это директория, в которой мы хотим произвести поиск, опции — это ключи-параметры поиска.
Найти и скопировать
Найти и сразу скопировать в текущую директорию
find /usr/share/doc -name '*.pdf' -exec cp {} . \;
Найти в текущей директории
find -name '*.pdf'
Удалить из текущей директории
find -name '*.pdf' -delete
Видео
Найти файлы по типу
Иногда вам может потребоваться поиск определенных типов файлов, таких как обычные файлы, каталоги или символические ссылки. В Linux все является файлом.
Для поиска файлов по их типу используйте параметр -type
и один из следующих дескрипторов, чтобы указать тип файла:
f
: обычный файл-
d
: каталог -
l
: символическая ссылка -
c
: символьные устройства -
b
: блочные устройства -
p
: именованный канал (FIFO) -
s
: сокет
Например, чтобы найти все каталоги в текущем рабочем каталоге , вы должны использовать:
Типичным примером может быть рекурсивное изменение разрешений файлов веб-сайтов на 644
и разрешений каталогов на 755
с помощью команды chmod
:
Найти файлы по разрешениям
Параметр -perm
позволяет вам искать файлы на основе прав доступа к файлам.
Например, чтобы найти все файлы с разрешениями ровно 775
внутри каталога /var/www/html
, вы должны использовать:
Вы можете поставить перед числовым режимом знак минус -
или косую черту /
.
Когда в качестве префикса используется косая черта /
, то по крайней мере одна категория (пользователь, группа или другие) должна иметь по крайней мере соответствующие биты, установленные для соответствия файлу.
Рассмотрим следующий пример команды:
Приведенная выше команда будет соответствовать всем файлам с разрешениями на чтение, установленными для пользователя, группы или других.
Если в качестве префикса используется минус -
, то для соответствия файла необходимо установить хотя бы указанные биты. Следующая команда будет искать файлы, которые имеют права на чтение и запись для владельца и группы и доступны для чтения другим пользователям:
Найти файлы по владельцу
Чтобы найти файлы, принадлежащие конкретному пользователю или группе, используйте параметры -user
и -group
.
Например, для поиска всех файлов и каталогов, принадлежащих пользователю baks
, вы должны выполнить:
Вот пример из реальной жизни. Допустим, вы хотите найти все файлы , принадлежащие пользователю www-data
и изменить владельца совпавших файлов из www-data
к nginx
:
Критерии
Критериев у команды find в Linux очень много, и мы опять же рассмотрим только основные.
- -name — поиск файлов по имени.
- -perm — поиск файлов в Linux по режиму доступа.
- -user — поиск файлов по владельцу.
- -group — поиск по группе.
- -mtime — поиск по времени модификации файла.
- -atime — поиск файлов по дате последнего чтения.
- -nogroup — поиск файлов, не принадлежащих ни одной группе.
- -nouser — поиск файлов без владельцев.
- -newer — найти файлы новее чем указанный.
- -size — поиск файлов в Linux по их размеру.
Синтаксис команды 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 с использованием критериев
Найти в текущем каталоге обычные файлы (не каталоги), имя которых начинается с символа «~».
Найти в текущем каталоге файлы, измененные позже, чем файл file.bak.
Операторы
Критерии можно объединять, используя операторы. Ниже приведены операторы в порядке убывания их приоритета.
Короткая форма оператора | Длинная форма | Описание |
---|---|---|
! критерий | -not | Отрицание (возвращает true, если критерий false) |
критерий1-a критерий2 | -and | Оператор И (true, если критерий1 и критерий2 true) |
критерий1-o критерий2 | -or | Оператор ИЛИ (true, если критерий1 или критерий2 true) |
В общем случае при использовании операторов критерии проверяются в порядке их приоритета. Изменить порядок можно с помощью скобок. Скобки нужно выделять с помощью обратного слеша.
Примеры использования команды find с использованием операторов
Найти в текущем каталоге файлы, начинающиеся с символа «~» или c «temp» и являющиеся именно обычными файлами (-type f), а не каталогами.
Найти в текущем каталоге (не обрабатывая подкаталоги — -maxdeph 1) обычные файлы (-file f) размером больше 600 мегабайт и менее 1 гигабайта (-size) или файлы имя которых заканчивающиется на «.mpeg» (-name).
Действия над файлами
Когда выполняется команда find, вы можете выполнять различные действия над найденными файлами. Рассмотрим основные из них.
-exec команда \; | Выполнить команду. Обратите внимание, что после команды ставится обратный слеш и точка с запятой. |
-execdir команда \; | То же самое что и exec, но команда вызывается из подкаталога, содержащего текущий файл. |
-ok команда \; | То же самое, что и exec, но перед обработкой очередного файла будет выводится запрос на выполнение команды. |
-okdir команда \; | То же что ok для execdir. |
Вывод имени файла на экран. | |
-ls | Выполнение команды ls -dils над текущим файлом. |
В выполняемых командах вы можете использовать параметр {} в качестве аргумента, который заменяется путем к текущему файлу.
Примеры использования команды find с использованием действий
Найти в текущем каталоге обычные файлы размером больше 1000 байт и выполнить над ними команду ls -dils (действие ls).
Найти в текущем каталоге обычные файлы, начинающиеся с символа тильда «~», и для каждого файла выдавать запрос на его удаление (на выполнение команды rm).
Основные опции команды find
- -name — поиск файлов по имени;
- -user — поиск файлов, принадлежащих указанному пользователю;
-
-type — поиск файлов определенного типа. Вот наиболее используемые типы:
- d – каталог;
- f – обычный файл;
- l – символическая ссылка;
- -size -n,+n, n — поиск файлов с размером меньше(-), больше (+) или равное n единиц;
- -mtime -n, +n — поиск файлов, созданных или модифицируемых менее чем (-) или более чем (+) n дней назад.
Поиск файлов по дате изменения
find
также может искать файлы на основе их последнего изменения, доступа или изменения времени.
То же, что и при поиске по размеру, используйте символы «плюс» и «минус» для «больше чем» или «меньше чем».
Допустим, несколько дней назад вы изменили один из файлов конфигурации dovecot, но забыли, какой именно. Вы можете легко отфильтровать все файлы в /etc/dovecot/conf.d
каталоге, который заканчивается .conf
и был изменен за последние пять дней с помощью:
Вот еще один пример фильтрации файлов по дате изменения с использованием этой -daystart
опции. Команда ниже выведет список всех файлов в /home
каталоге, которые были изменены 30
или несколько дней назад:
-prune: ограничить глубину
С помощью path можно посмотреть содержимое всех поддиректорий code на букву p /code/p* Если нужно посмотреть только поддиректории верхнего уровня — используется -prune
find . -path «./code/p*» -prune
./code/python ./code/php
Получили только поддиректории без их содержимого
Чистка по расписанию
Команду find удобно использовать для автоматического удаления устаревших файлов.
Открываем на редактирование задания cron:
crontab -e
И добавляем:
0 0 * * * /bin/find /tmp -mtime +14 -exec rm {} \;
* в данном примере мы удаляем все файлы и папки из каталога /tmp, которые старше 14 дней. Задание запускается каждый день в 00:00. * полный путь к исполняемому файлу find смотрим командой which find — в разных UNIX системах он может располагаться в разных местах.