#!/bin/bash # --- 配置 --- # 设置要压缩的源目录 SOURCE_DIR="/opt/mcsmanager/daemon/data/InstanceData" # 设置存放压缩包的目标目录 DEST_DIR="/mnt/sdb1/mc-backup" # 设置备份文件的最大保留数量 MAX_BACKUPS=100 # --- 配置结束 --- # --- 脚本主体 --- # 检查源目录是否存在 if [ ! -d "$SOURCE_DIR" ]; then echo "错误: 源目录 '$SOURCE_DIR' 不存在。" exit 1 fi # 检查目标目录是否存在,如果不存在则创建 if [ ! -d "$DEST_DIR" ]; then echo "提示: 目标目录 '$DEST_DIR' 不存在,正在创建..." mkdir -p "$DEST_DIR" fi # --- 清理旧备份 --- # 切换到备份目录进行操作 cd "$DEST_DIR" || exit # 获取当前备份文件的数量 CURRENT_BACKUP_COUNT=$(ls -1q *.tar.gz 2>/dev/null | wc -l) echo "当前已有 $CURRENT_BACKUP_COUNT 个备份。最大保留数量为 $MAX_BACKUPS。" # 当备份数量大于等于设定的最大值时,循环删除最旧的文件 while [ "$CURRENT_BACKUP_COUNT" -ge "$MAX_BACKUPS" ]; do # ls -tr: 按修改时间排序(最旧的在最前) # head -n 1: 获取列表中的第一个文件(即最旧的文件) OLDEST_BACKUP=$(ls -tr *.tar.gz | head -n 1) if [ -n "$OLDEST_BACKUP" ]; then echo "备份数量已达上限,正在删除最旧的备份: $OLDEST_BACKUP" rm -f "$OLDEST_BACKUP" # 更新文件数量 CURRENT_BACKUP_COUNT=$((CURRENT_BACKUP_COUNT - 1)) else # 如果没有找到匹配的文件,则退出循环 break fi done # --- 清理完成 --- # --- 创建新备份 --- # 获取当前时间并格式化为 YYYY-MM-DD_HH-MM-SS CURRENT_TIME=$(date +"%Y-%m-%d_%H-%M-%S") # 定义压缩文件的完整路径和名称 ARCHIVE_NAME="$CURRENT_TIME.tar.gz" DEST_FILE="$DEST_DIR/$ARCHIVE_NAME" # 获取源目录的基础名称 (例如 /path/to/source -> source) # 使用 -P 选项可以处理符号链接,确保获取的是实际的目录名 SOURCE_BASE_NAME=$(basename "$SOURCE_DIR") echo "----------------------------------------" echo "正在创建新备份..." echo "源目录: $SOURCE_DIR" # 执行压缩命令 # -c: 创建一个新的归档 # -z: 通过 gzip 进行压缩 # -v: 显示处理过程中的文件 # -f: 指定归档文件名 # -C: 切换到指定目录后再执行操作,避免压缩包中包含完整的父路径 tar -czvf "$DEST_FILE" -C "$(dirname "$SOURCE_DIR")" "$SOURCE_BASE_NAME" echo "----------------------------------------" if [ $? -eq 0 ]; then echo "✅ 新备份创建成功!" echo "备份文件已保存至: $DEST_FILE" else echo "❌ 备份创建失败。" fi echo "----------------------------------------" exit 0