shell-backup/backup.sh
2025-06-07 08:33:02 +08:00

90 lines
2.6 KiB
Bash

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