set -e shopt -s nullglob KEEP=5 # glob 字符类只匹配严格的 backup-YYYYMMDD-HHMMSS;nullglob 让无匹配时展开为空数组。 # glob 结果按字典序排列,对该命名格式而言等价于时间戳升序(最早的在前)。 rollbacks=() for p in /data/pms/backup-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]; do if [ -d "$p" ]; then rollbacks+=( "$p" ) fi done total=${#rollbacks[@]} echo " 当前回滚点 $total 个(deploy 会为每次部署新建一份):" for p in "${rollbacks[@]}"; do echo " $p" done if [ "$total" -gt "$KEEP" ]; then drop=$((total - KEEP)) echo " 将删除最早的 $drop 个(保留最近 $KEEP 个):" i=0 for p in "${rollbacks[@]}"; do if [ "$i" -ge "$drop" ]; then break fi i=$((i + 1)) # 复核:名字必须严格符合 backup-YYYYMMDD-HHMMSS,否则拒绝删除(绝不碰其它目录) case "$(basename "$p")" in backup-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]) echo " 删除 $p" rm -rf -- "$p" ;; *) echo " [skip] 名字不符合回滚点模式,拒绝删除: $p" ;; esac done else echo " 回滚点数量未超过 $KEEP,无需清理" fi kept=() for p in /data/pms/backup-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9]; do if [ -d "$p" ]; then kept+=( "$p" ) fi done echo " 清理后保留的回滚点 ${#kept[@]} 个:" for p in "${kept[@]}"; do echo " $p" done echo " /data/pms 占用: $(du -sh /data/pms | cut -f1)"