find
100%

Командная строка · Урок 14

find

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

Команда find обходит дерево каталогов и проверяет записи по критериям: имени, типу, размеру или времени изменения.

Выбор места поиска

Базовый синтаксис:

find [PATH] [EXPRESSION]

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

Следующая команда ищет в /home и потомках записи с именем puppies.jpg:

$ find /home -name puppies.jpg

Рекурсия включена по умолчанию. Точка . начинает поиск с текущего дерева.

Какая команда ищет в текущем каталоге и потомках записи notes.txt?

Совпадение имён и типов

Тест -name принимает точное базовое имя или шаблон оболочки. Заключайте шаблон в кавычки, чтобы текущая оболочка передала его find без изменений:

$ find . -name "*.txt"

Без кавычек оболочка может раскрыть *.txt в текущем каталоге до запуска find. Для поиска без учёта регистра используйте -iname.

-type d выбирает каталоги, а -type f — обычные файлы:

$ find /home -type d -name MyFolder

Здесь оба теста обязаны быть истинными: запись должна быть каталогом с базовым именем MyFolder.

Какая команда находит под текущим каталогом обычные файлы с именами на .txt?

Размер и время изменения

В -size знак + означает больше указанной единицы, а - — меньше:

$ find . -type f -size +10M
$ find . -type f -size -1k

Прописная M означает единицы по 1 048 576 байт, строчная k — по 1024 байта. Перед сравнением find округляет размер вверх до выбранной единицы, поэтому границы основаны на этих единицах.

-mtime проверяет число полных 24-часовых периодов после изменения:

$ find . -type f -mtime -7
$ find . -type f -mtime +30

-mtime -7 означает значение меньше 7, а -mtime +30 — больше 30. Это полные сутки, а не границы календарной полуночи.

Какая команда находит под . обычные файлы, изменённые менее семи полных 24-часовых периодов назад?

Вывод и действия над совпадениями

Без действия GNU find печатает совпавшие пути. -print можно указать явно для ясности:

$ find . -name "*.log" -print

-exec запускает другую команду для совпадений:

$ find . -name "*.log" -exec ls -l {} \;

В форме с \; заполнитель {} заменяется одним совпавшим путём для каждого запуска. Точка с запятой завершает действие -exec и экранируется, чтобы оболочка передала её find.

Перед разрушительным -delete или меняющей файлы командой -exec выполните те же тесты с -print и проверьте каждый результат. Более узкий путь и -maxdepth N также ограничивают поиск.

Вы разрабатываете find, который позже может удалять старые .log. Что сделать сначала?

Что обозначает {} в find . -name "*.log" -exec ls -l {} \;?

Ошибки Permission denied означают, что учётная запись не может пройти часть дерева. Предпочитайте узкий релевантный путь и не повышайте права, пока не понимаете и не намерены расширять доступ.

Урок завершён

Вы завершили find

Теперь вы умеете строить точные выражения find и проверять результаты до действий.

  • Выбирать самый узкий полезный начальный путь.

  • Заключать шаблоны имён в кавычки и сочетать их с типом.

  • Фильтровать по размеру или полным 24-часовым периодам изменения.

  • При необходимости ограничивать глубину рекурсии.

  • Печатать и проверять совпадения до разрушительных действий.

Сохраните прогресс

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

Создать бесплатный аккаунт
Следующий Урок
Назад к Командная строка