Команда, удаляющая все старые файлы, папки и подпапки

Команда, удаляющая все старые файлы, папки и подпапки

Мне нужна команда, которая удаляет все файлы, папки и подпапки, которые не обновлялись дольше 31 дня. Я попробовал это

find . -mindepth 1 -mtime +31 -exec rm -rf "{}" \;

Но если у меня будет такая иерархия

.
├── old_sub_folder1
└── old_sub_folder2
    ├── old_file
    └── old_sub_folder3
        └── new_file

где old_*находятся старые папки\файлы и new_fileнаходится новый файл.

Эта команда удалит все содержимое. Поскольку old_sub_folder2дата не была обновлена ​​после new_fileсоздания.

Мне нужна команда, которая не удаляла бы old_sub_folder2/old_sub_folder3/new_file

решение1

Проблема в том, что вы добавили -rопцию в свою rmкоманду. Это удалит папки, даже если они не пустые.

Это нужно сделать в два этапа:

  1. Удалить толькостарые файлы:

    find . -type f -mtime +31 -delete

  2. Чтобы удалить старые папки, если они пусты, мы можем заглянутьздесь, и немного его подправим:

    find . -type d -empty -mtime +31 -delete

решение2

find  . -type d ! -name . -mtime +31 -exec sh -c '
   case $(find "$1" ! -mtime +31 -exec echo x \; -prune) in
      "" ) rm -rf "$1" || echo "Error could not delete folder \"$1\"" ;;
   esac
' {} {} \;

Из текущего каталога мы запускаем findи смотрим только directoriesто, что не обновлялось с последних 31 дня. И в каждом из этих каталогов мы по очереди ныряем и ищем все, что не старше 31 дня, и при его нахождении мы отображаем фиктивный символ и также отсекаем любой прямой поиск (в идеале мы должны просто завершить наш поиск здесь с помощью , -quitно это не так, POSIXпоэтому мы довольствуемся -prune).

Затем мы смотрим на результат этой findоперации, и если он оказывается пустым, мы знаем, что ни один элемент (файл/каталог/ссылка и т. д.) не был новым, и, следовательно, этот каталог можно безопасно удалить.

Связанный контент