Команда find обходит дерево каталогов и проверяет записи по критериям: имени, типу, размеру или времени изменения.
Командная строка · Урок 14
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 означают, что учётная запись не может пройти часть дерева. Предпочитайте узкий релевантный путь и не повышайте права, пока не понимаете и не намерены расширять доступ.
Для практики:
- Команда Linux find: поиск файлов — ищите файлы и каталоги по критериям.
- Обнаружение важных системных ресурсов — находите файлы и исполняемые программы в файловой системе.
Урок завершён
Вы завершили find
Теперь вы умеете строить точные выражения find и проверять результаты до действий.
Выбирать самый узкий полезный начальный путь.
Заключать шаблоны имён в кавычки и сочетать их с типом.
Фильтровать по размеру или полным 24-часовым периодам изменения.
При необходимости ограничивать глубину рекурсии.
Печатать и проверять совпадения до разрушительных действий.
Сохраните прогресс
Создайте бесплатный аккаунт, чтобы сохранить этот урок и продолжить на любом устройстве.
Создать бесплатный аккаунт