Цель урока: Научиться использовать команду find на профессиональном уровне. Мы выйдем за рамки простого поиска по имени и освоим поиск по множеству критериев: размеру, дате изменения, правам доступа, владельцу. Самое главное - мы научимся не просто находить файлы, а немедленно выполнять над ними нужные действия, что является ключом к мощной автоматизации.
Часть 1: Теория. Почему find - это не ls
В предыдущих уроках мы использовали команду ls для просмотра содержимого каталогов. ls - это как оглавление в книге: вы видите, что есть на этой "странице" (в этом каталоге).
Команда find - это совершенно другой инструмент. Это как поисковая система по всей "библиотеке" (вашей файловой системе). Она позволяет задавать очень сложные и точные запросы для поиска нужных "книг" (файлов и каталогов), где бы они ни находились.
Базовый синтаксис find выглядит так:
find [ГДЕ_ИСКАТЬ] [ПО_КАКИМ_КРИТЕРИЯМ] [ЧТО_ДЕЛАТЬ]
-
[ГДЕ_ИСКАТЬ]: Стартовый каталог, откуда find начнет свой рекурсивный поиск (т.е. он будет заходить во все вложенные папки). Например, . (текущий каталог) или / (вся система).
-
[ПО_КАКИМ_КРИТЕРИЯМ]: Набор условий для поиска. Это самая интересная часть.
-
[ЧТО_ДЕЛАТЬ]: Действие, которое нужно выполнить над каждым найденным файлом. По умолчанию - просто напечатать его имя на экран.
Часть 2: Практика. Поиск по различным критериям
Давайте на практических примерах разберем самые полезные критерии поиска. Для экспериментов мы будем работать в нашем каталоге ~/scripts.
1. Поиск по имени (-name) и типу (-type)
Это самый базовый вид поиска.
-
-name "шаблон": Искать по точному имени или шаблону (где * - любые символы). Важно: шаблон лучше всегда брать в кавычки, чтобы его не интерпретировала сама оболочка bash.
-
-iname "шаблон": То же самое, но без учета регистра ( insensitive).
-
-type ТИП: Искать объекты определенного типа. Самые частые типы: f - обычный file (файл), d - directory (каталог).
Примеры:
# Найти все скрипты с расширением .sh в текущем каталоге
find . -type f -name "*.sh"
# Найти все каталоги с именем 'backups' во всей системе
# (этот поиск может занять время и выдать ошибки доступа, что нормально)
find / -type d -name "backups"

2. Поиск по времени модификации (-mtime)
Очень полезно для поиска старых или недавно измененных файлов.
-
-mtime N: Файлы, измененные ровно N*24 часа назад.
-
-mtime -N: Файлы, измененные менее чем N дней назад (т.е. за последние N дней).
-
-mtime +N: Файлы, измененные более чем N дней назад (т.е. старее N дней).
Пример:
# Найти все файлы в домашней директории (~), измененные за последние 2 дня
find ~ -type f -mtime -2
3. Поиск по размеру (-size)
Помогает находить слишком большие или пустые файлы.
-
-size Nс: Файлы размером ровно N байт (characters).
-
-size +Nk: Файлы размером больше N килобайт.
-
-size -NM: Файлы размером меньше N Мегабайт.
-
-size +NG: Файлы размером больше N Гигабайт.
Пример:
# Найти все файлы в каталоге /var/log размером больше 10 Мегабайт
find /var/log -type f -size +10M
4. Поиск по правам доступа (-perm) и владельцу (-user)
Критически важно для аудита безопасности.
-
-perm ПРАВА: Искать файлы с конкретными правами (например, 644).
-
-user ИМЯ_ПОЛЬЗОВАТЕЛЯ: Искать файлы, принадлежащие указанному пользователю.
Пример:
# Найти все файлы в /var/www, принадлежащие пользователю www-data
find /var/www -user www-data
# Найти все файлы в текущем каталоге, у которых есть права на исполнение для всех
find . -type f -perm 777
Сила find раскрывается, когда вы начинаете комбинировать условия. По умолчанию, если вы пишете несколько критериев подряд, они объединяются логическим "И" (-and).
Пример: Найти все файлы с расширением .log, размером больше 1Мб, которые не менялись более 7 дней, в каталоге /var/log.
find /var/log -type f -name "*.log" -size +1M -mtime +7
Часть 4: Практика. Выполнение команд над найденными файлами (-exec)
Это самая мощная возможность find. Она позволяет не просто найти, а сразу что-то сделать с найденными файлами.
Синтаксис:
... -exec КОМАНДА {} \;
-
-exec: Ключевое слово, которое говорит: "для каждого найденного файла выполни следующую команду".
-
КОМАНДА: Любая команда Linux, например,
rm
,chmod
,cp
. -
{}: Это специальный "заполнитель" (placeholder). find автоматически подставит на это место имя каждого найденного файла.
-
\;: Обязательная точка с запятой в конце, которая говорит find, где заканчивается команда для -exec. Обратный слэш \ нужен, чтобы оболочка bash не "перехватила" точку с запятой, а передала ее именно команде find.
Пример 1: Удаление временных файлов
Найдем и удалим все файлы с расширением .tmp в домашнем каталоге.
find ~ -type f -name "*.tmp" -exec rm -f {} \;
Как это работает:
-
find находит файл, например, /root/temp_file.tmp.
-
Он видит -exec и формирует команду, подставляя имя файла вместо {}. Получается: rm -f /root/temp_file.tmp.
-
Выполняет эту команду.
-
Продолжает поиск следующего файла.
Пример 2: Изменение прав
Найдем все скрипты (.sh) в текущей папке, у которых нет прав на исполнение, и добавим их.
# ! - это логическое "НЕ"
find . -type f -name "*.sh" ! -perm /a=x -exec chmod +x {} \;
Здесь мы добавили условие ! -perm /a=x - "у которых НЕТ прав на исполнение (x) для всех (a)".
Итоги урока
-
Что мы освоили:
-
Принцип работы find как поисковой системы для файлов.
-
Как искать файлы по множеству критериев: имени (-name), типу (-type), времени (-mtime), размеру (-size), правам (-perm).
-
Как комбинировать критерии для создания точных поисковых запросов.
-
Как использовать мощнейшую опцию -exec для выполнения команд над найденными файлами, используя {} и \;.
-
На следующем, 17-м уроке, мы продолжим наше погружение в обработку данных и освоим grep на профессиональном уровне. Мы научимся использовать регулярные выражения для поиска не просто слов, а сложных текстовых шаблонов, что является абсолютно необходимым навыком для анализа системных логов.
Перейти к просмотру - УРОК №17.
Промо-код: PROMO15 - скидка 15%!
Введите при оформлении первого заказа на сайте: Hosting-VDS.com