find ‑delete “directory not empty”

Автор: | 17 апреля 2022

С фай­ла­ми всё все­гда было про­сто:

find /var/path/ -type f -mtime +10 -delete

И все, нахо­дит все фай­лы по ука­зан­но­му пути, кото­рые стар­ше 10 дней и уда­ля­ет их. Но если такое попро­бо­вать сде­лать с дирек­то­ри­я­ми — полу­чим ошиб­ку “directory not empty”. Но выход есть, мож­но исполь­зо­вать xargs

В прин­ци­пе строч­ка про­сто ста­нет немно­го длин­нее и будет выгля­деть так:

find /var/path/ -type f -mtime +10 -print0 | xargs -0 -I {} /bin/rm -rg "{}" 

На самом деле все­гда страш­но исполь­зо­вать rm -r, но что поде­лать. А вот скрип­тик для кро­на, для уда­ле­ния бека­пов, кото­рые выгля­дят как пап­ки (к при­ме­ру clickhouse такие бека­пы созда­ет)

#!/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"

Всё. Добав­ля­ем его в крон и по фак­ту выпол­не­ния полу­ча­ем на почту сооб­ще­ние с логом.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*