Мне нужна команда, которая удаляет все файлы, папки и подпапки, которые не обновлялись дольше 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
команду. Это удалит папки, даже если они не пустые.
Это нужно сделать в два этапа:
Удалить толькостарые файлы:
find . -type f -mtime +31 -delete
Чтобы удалить старые папки, если они пусты, мы можем заглянутьздесь, и немного его подправим:
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
операции, и если он оказывается пустым, мы знаем, что ни один элемент (файл/каталог/ссылка и т. д.) не был новым, и, следовательно, этот каталог можно безопасно удалить.