Команда find в Linux, использование delete и prune вызывает ошибку.

Вопрос или проблема

Я пытаюсь просканировать резервный диск и удалить файлы старше примерно двух лет. Однако есть одна папка, которую я хочу пропустить, так как именно туда попадают нужные старые файлы.

Вот команда, которую я пытался использовать:
find /mnt/backup/ -path ‘/mnt/backup/home/shares/Projects/Projects Archive’ -prune -o -atime +731 -type f -delete*

Я получаю следующий результат:

find: Действие -delete автоматически включает -depth, но -prune ничего не делает, когда -depth активно. Если вы все же хотите продолжить, просто явно используйте опцию -depth.

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

Заранее спасибо.
B

Я недостаточно хорошо понимаю find, чтобы знать, есть ли более элегантное решение, но вы можете сделать что-то подобное:

find /mnt/backup -atime +731 | \ 
grep --null --invert-match '/mnt/backup/home/shares/Projects/Projects Archive' | \ 
xargs -0 -n 10 rm -r

Это выполняет find для поиска старых файлов, удаляет файлы в исключенной папке с помощью grep, а затем использует xargs и rm -r для их удаления. Это не идеально, потому что в зависимости от поведения find по глубине и ширине, это может рекурсивно удалить папку, а затем попытаться удалить файл в этой папке, который уже был удален. Мне нравится этот стиль составной команды, потому что вместо выполнения команды rm -r вы можете запустить echo, чтобы отладить скрипт и убедиться, что он работает как ожидается перед выполнением.

другой подход для исключения конкретной папки при удалении файлов старше двух лет

find /mnt/backup/ -path '/mnt/backup/home/shares/Projects/Projects Archive' -prune -o -atime +731 -type f -exec rm {} \;

https://linuxconfig.org/how-to-explicitly-exclude-directory-from-find-command-s-search

Ответ или решение

Команда find в Linux является мощным инструментом для поиска и манипуляции файлами и директориями. Ваша задача состоит в том, чтобы удалить файлы старше двух лет с исключением одной конкретной папки. Вы столкнулись с ошибкой, связанной с использованием флагов -prune и -delete. Давайте разберем, как можно обойти эту ошибку и достичь желаемого результата.

Понимание проблемы

Ошибка, которую вы получили:

find: The -delete action automatically turns on -depth, but -prune does nothing when -depth is in effect. 
If you want to carry on anyway, just explicitly use the -depth option.

указывает на то, что флаг -delete заставляет команду find игнорировать директиву -prune. Это происходит потому, что -delete автоматически включает режим обхода глубины, что нарушает логику исключения с помощью -prune.

Альтернативные подходы

Чтобы достичь вашей цели, можно использовать несколько различных методов.

Способ 1: Использование -exec

Один из самых простых и наиболее предпочтительных способов избежать этой проблемы – использовать -exec вместо -delete. Это дает вам возможность явно указать, какие файлы будут удалены, что позволяет избежать конфликтов с -prune.

Вот правильная команда, которая выполнит вашу задачу:

find /mnt/backup/ -path '/mnt/backup/home/shares/Projects/Projects Archive' -prune -o -atime +731 -type f -exec rm {} \;

Разбор команды:

  • -path: указывает путь, который нужно исключить.
  • -prune: предотвращает дальнейший обход указанной директории.
  • -o: логическое «или» — если -prune не сработал, дальше выполнять.
  • -atime +731: находит файлы, которые не изменялись в последние 731 день.
  • -type f: выбирает только файлы.
  • -exec rm {} \;: выполняет команду удаления для найденных файлов.

Способ 2: Использование grep и xargs

Другой более сложный метод – это использование grep для фильтрации вывода команды find, а затем передача результатов в rm. Однако этот метод менее предпочтителен, так как он может привести к ошибкам при одновременном удалении директорий и файлов, если структура каталогов сложная.

Вот пример:

find /mnt/backup -atime +731 | grep --invert-match '/mnt/backup/home/shares/Projects/Projects Archive' | xargs -d '\n' rm -f

Обратите внимание: Перед тем как использовать xargs для удаления, вы можете заменить rm -f на echo rm, чтобы увидеть, какие файлы будут удалены, что полезно для отладки.

Заключение

Используя предложенные вами решения, вы сможете успешно удалить файлы, старше двух лет, исключив при этом необходимые директории. Рекомендуется использовать первый способ с -exec, так как он более прямой и менее подвержен ошибкам. Убедитесь, что вы тестируете команды в безопасной среде, чтобы избежать случайного удаления нужных данных.

Оцените материал
Добавить комментарий

Капча загружается...