Linux系统自动删除7天以前的文件,Linux自动删除15天以前的文件
一、删除15天以前的文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #!/bin/bash set -eo pipefail
# ========== 配置区 ========== BACKUP_DIR="/data/backups" # 备份目录 RETENTION_DAYS=15 # 删多少天前的备份 KEEP_MIN=5 # 强制保留最新几份(防全删) BACKUP_PATTERN="*.tar.gz" # 备份文件格式(目录备份改为 "202*") BACKUP_TYPE="f" # f=文件 / d=目录 DRY_RUN=false # true=只打印不删除,先测试再开false # ============================
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"; }
# 前置检查 [ ! -d "$BACKUP_DIR" ] && { log "[ERROR] 目录 $BACKUP_DIR 不存在"; exit 1; }
log "===== 开始清理 =====" $DRY_RUN && log "[WARN] 预演模式,不会实际删除"
# 找所有备份,按时间倒序(最新在前) backups=() while IFS= read -r f; do [ -n "$f" ] && backups+=("$f"); done < <( find "$BACKUP_DIR" -maxdepth 1 -type "$BACKUP_TYPE" -name "$BACKUP_PATTERN" -printf "%T@ %p\n" | sort -nr | cut -d' ' -f2- ) total=${#backups[@]} log "共找到 $total 个备份"
# 备份太少直接退出 [ "$total" -le "$KEEP_MIN" ] && { log "[OK] 备份不足 $KEEP_MIN 份,无需清理"; exit 0; }
# 跳过最新KEEP_MIN份,只删后面超期的 now=$(date +%s) del=0 for ((i=KEEP_MIN; i<total; i++)); do f="${backups[$i]}" age=$(( (now - $(stat -c "%Y" "$f")) / 86400 )) if [ "$age" -gt "$RETENTION_DAYS" ]; then $DRY_RUN && log "[预演删除] $f (已存${age}天)" || { rm -rf "$f" && log "[已删除] $f (已存${age}天)"; } ((del++)) fi done
# 清空空目录 $DRY_RUN || find "$BACKUP_DIR" -depth -type d -empty -delete 2>/dev/null
log "本次删除 $del 个过期备份,保留最新至少 $KEEP_MIN 份" log "===== 清理完成 ====="
|
一、删除15天以前的文件(美化版)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #!/bin/bash set -eo pipefail
# ========== 配置区 ========== BACKUP_DIR="/data/backups" # 备份目录 RETENTION_DAYS=15 # 删多少天前的备份 KEEP_MIN=5 # 强制保留最新几份(防全删) BACKUP_PATTERN="*.tar.gz" # 备份文件格式(目录备份改为 "202*") BACKUP_TYPE="f" # f=文件 / d=目录 DRY_RUN=false # true=只打印不删除,先测试再开false # ============================
# 颜色定义 RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; NC='\033[0m' log() { echo -e "${CYAN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1"; }
# 前置检查 [ ! -d "$BACKUP_DIR" ] && { log "${RED}❌ 目录 $BACKUP_DIR 不存在${NC}"; exit 1; }
log "===== 🧹 开始清理备份 =====" $DRY_RUN && log "${YELLOW}⚠️ 预演模式,不会实际删除${NC}"
# 找所有备份,按时间倒序(最新在前) backups=() while IFS= read -r f; do [ -n "$f" ] && backups+=("$f"); done < <( find "$BACKUP_DIR" -maxdepth 1 -type "$BACKUP_TYPE" -name "$BACKUP_PATTERN" -printf "%T@ %p\n" | sort -nr | cut -d' ' -f2- ) total=${#backups[@]} log "ℹ️ 共找到 $total 个备份"
# 备份太少直接退出 [ "$total" -le "$KEEP_MIN" ] && { log "${GREEN}✅ 备份不足 $KEEP_MIN 份,无需清理${NC}"; exit 0; }
# 跳过最新KEEP_MIN份,只删后面超期的 now=$(date +%s) del=0 for ((i=KEEP_MIN; i<total; i++)); do f="${backups[$i]}" age=$(( (now - $(stat -c "%Y" "$f")) / 86400 )) if [ "$age" -gt "$RETENTION_DAYS" ]; then if $DRY_RUN; then log "${YELLOW}🔍 待删除:$f (已存${age}天)${NC}" else rm -rf "$f" && log "${RED}🗑️ 已删除:$f (已存${age}天)${NC}" fi ((del++)) fi done
# 清空空目录 $DRY_RUN || find "$BACKUP_DIR" -depth -type d -empty -delete 2>/dev/null
log "✅ 本次删除 $del 个过期备份,强制保留最新 $KEEP_MIN 份不会清空" log "===== 🎉 清理完成 ====="
|