Поиск файлов через find: условия, действия и безопасное удаление

Утилита find обходит дерево каталогов и проверяет каждый путь по заданным условиям. В отличие от поиска по заранее построенному индексу она видит текущее состояние файловой…

Утилита find обходит дерево каталогов и проверяет каждый путь по заданным условиям. В отличие от поиска по заранее построенному индексу она видит текущее состояние файловой системы и умеет отбирать объекты по имени, типу, времени, размеру и правам.

Область обхода и выражение

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

mkdir -p /tmp/find-demo/src /tmp/find-demo/cache
printf 'const ready = true;\n' >/tmp/find-demo/src/app.ts
printf 'old cache\n' >/tmp/find-demo/cache/result.log
find /tmp/find-demo -type f -name '*.ts' -print
find /tmp/find-demo -type f -size +5c -printf '%s %p\n'

-type f исключает каталоги, -name сравнивает только последнее имя, а -path — весь путь. Шаблон нужно заключать в кавычки, иначе его раньше времени раскроет shell относительно текущего каталога.

Исключение поддеревьев и приоритет

-prune не даёт descend внутрь совпавшего каталога. Операторы AND и OR имеют приоритет, поэтому сложное выражение лучше группировать экранированными скобками.

find /tmp/find-demo \
  -path '*/cache' -prune -o \
  -type f \( -name '*.ts' -o -name '*.js' \) -print

Без явного -print некоторые действия ничего не выводят. Сначала стройте проверяемый список, затем добавляйте изменение.

Безопасная передача найденных имён

Имена файлов могут содержать пробелы и даже переводы строк. Конструкция find ... | xargs command без протокола NUL ломает такие пути. Надёжные варианты — -exec command {} + или пара -print0 | xargs -0.

find /tmp/find-demo -type f -name '*.log' -exec wc -c -- {} +
find /tmp/find-demo -type f -print0 | xargs -0 -r printf '<%s>\n'

Маркер -- завершает опции утилиты, чтобы имя вроде -rf не стало флагом.

Ошибка и диагностика

Опасная ошибка — сразу применять -delete к непроверенному выражению. Покажите кандидатов через -print, ограничьте стартовый каталог абсолютным ожидаемым путём и проверьте число строк. Помните, что -delete влияет на порядок обхода и не сочетается с бездумным -prune. Для критичного сценария сначала перемещайте найденное в карантин.

Практика

Создайте дерево с исходниками, логами и каталогом vendor. Найдите только .log старше заданного времени, не заходя в vendor; вместо удаления выведите размер и путь через -exec. Добавьте файл с пробелом и убедитесь, что он обработан одним аргументом.

Что важно запомнить

Источники