Вопрос или проблема
Я пытаюсь просканировать резервный диск и удалить файлы старше примерно двух лет. Однако есть одна папка, которую я хочу пропустить, так как именно туда попадают нужные старые файлы.
Вот команда, которую я пытался использовать:
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
, так как он более прямой и менее подвержен ошибкам. Убедитесь, что вы тестируете команды в безопасной среде, чтобы избежать случайного удаления нужных данных.