周五备份,其他几天全量备份,保留七天的备份,因为增量备份是基于全量备份,所以有增量依赖的全量备份是不能删除的
|
#!/bin/bash
# 备份清理策略: # 1. 每周五生成全量备份(目录名前8位为YYYYMMDD) # 2. 其他日子生成增量备份 # 3. 清理超过7天的备份目录 # 4. 保留所有7天内增量备份依赖的全量备份
# 获取7天前的日期(YYYYMMDD格式) seven_days_ago=$(date -d "7 days ago" +%Y%m%d)
# 查找所有备份目录(以8位数字开头的目录) find . -maxdepth 1 -type d -name '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*' | while read -r dir; do # 提取目录名前8位日期部分 dirname=$(basename "$dir") dir_date=${dirname:0:8}
# 跳过7天内的目录(无论类型都保留) if [[ "$dir_date" -ge "$seven_days_ago" ]]; then echo "保留: $dirname (7天内)" continue fi
# 获取该目录创建日期是星期几(0=周日, 5=周五) weekday=$(date -d "$dir_date" +%w 2>/dev/null)
if [[ $? -ne 0 ]]; then echo "警告: 跳过无效日期目录 $dirname" continue fi
# 处理全量备份目录(周五创建的) if [[ "$weekday" == "5" ]]; then # 检查是否有依赖此全量备份的增量备份 has_dependent=false
# 查找此全量备份之后7天内的增量备份 for i in {1..6}; do check_date=$(date -d "$dir_date +$i days" +%Y%m%d)
# 检查是否有以该日期开头的增量备份目录 if [[ "$check_date" -ge "$seven_days_ago" ]] && compgen -G "${check_date}*" > /dev/null; then echo "保留全量: $dirname (被增量备份 ${check_date}* 依赖)" has_dependent=true break fi done
# 没有依赖的增量备份,可以安全删除 if ! $has_dependent; then echo "删除全量备份: $dirname" rm -rf "$dir" fi
# 处理增量备份目录(非周五创建) else # 查找对应的全量备份(上周五) # 计算当前日期是周几(0=周日,1=周一...6=周六) # 计算到上周五的天数偏移 offset=$(( (weekday + 2) % 7 )) last_friday=$(date -d "$dir_date -${offset} days" +%Y%m%d 2>/dev/null)
# 检查对应的全量备份目录是否存在 if compgen -G "${last_friday}*" > /dev/null; then echo "保留增量: $dirname (依赖全量备份 ${last_friday}*)" else echo "删除增量备份: $dirname (缺少全量备份)" rm -rf "$dir" fi fi done
|
浙公网安备 33010602011771号