С файлами всё всегда было просто:
1 | find /var/path/ -type f -mtime +10 -delete |
И все, находит все файлы по указанному пути, которые старше 10 дней и удаляет их. Но если такое попробовать сделать с директориями — получим ошибку «directory not empty». Но выход есть, можно использовать xargs
В принципе строчка просто станет немного длиннее и будет выглядеть так:
1 | find /var/path/ -type f -mtime +10 -print0 | xargs -0 -I {} /bin/rm -rg "{}" |
На самом деле всегда страшно использовать rm -r
, но что поделать. А вот скриптик для крона, для удаления бекапов, которые выглядят как папки (к примеру clickhouse такие бекапы создает)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #!/bin/bash #----------------- DEST="/var/lib/clickhouse/backup/" # путь до папки бекапов failed="false" # для обработки ошибок _find="/usr/bin/find" # путь до find log="/tmp/backup-delete.$$.txt" # временный файл лога # Выходим если $DEST не найден [ ! -d "$DEST" ] && exit 1 # Находим и удаляем рекурсивно все директории, которые старше 14 дней. Все что удаляем - заносим в текстовый лог $_find $DEST -type d -mtime +14 -print0 | xargs -I dir -0 /bin/rm -rvf "dir" >"${log}" [ $? -ne 0 ] && failed="true" # Отправим на почту результат выполнения и приложим текстовый лог if [ "$failed" == "true" ] then mail -A "$log" -s "Backup rotation failed " -r from@email.address to@email.address <<< "$0 script cached errors." else mail -A "$log" -s "Backup rotation successful" -r from@email.address to@email.address <<< "$0 script ran successfully." fi # Удалим временный лог если он есть [ -f "$log" ] && /bin/rm -f "$log" |
Всё. Добавляем его в крон и по факту выполнения получаем на почту сообщение с логом.