You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用rsync一次性备份两个源目录至带历史版本的不同目标路径

如何使用rsync一次性备份两个源目录至带历史版本的不同目标路径

嘿,我完全懂你想要的效果——给两个不同的源目录分别搭建独立的备份结构,每个源都有自己的历史快照(比如day1、day2)和指向最新备份的latest目录对吧?你之前的脚本问题在于把两个源都混到同一个备份路径里了,咱们调整一下思路,给每个源单独执行rsync操作,就能完美实现你要的目录结构啦。

修改后的脚本实现

下面是调整好的bash脚本,我会帮你拆解关键逻辑:

#!/bin/bash

# 获取当前时间戳,用于命名快照目录和日志
NOW=$(date +%y%m%d-%Hh%Mm%Ss)
# 备份根目录
BKP_ROOT=/mnt/backup

# 用关联数组存储源路径和对应的目标子目录名,方便后续扩展
declare -A BKP_SOURCES=(
    ["/home/pi/docker"]="docker"
    ["/var/lib/docker/volumes"]="volumes"
)

# 遍历每个源目录,单独执行备份
for src in "${!BKP_SOURCES[@]}"; do
    # 获取当前源对应的目标子目录名(比如docker/或volumes/)
    dest_subdir=${BKP_SOURCES[$src]}
    # 当前源的备份根路径
    bkp_dir=${BKP_ROOT}/${dest_subdir}
    # 当前快照的存储目录
    snapshot_dir=${bkp_dir}/${NOW}
    # 当前源的最新备份目录
    latest_dir=${bkp_dir}/latest

    # 提前创建必要的目录,避免rsync报错
    mkdir -p ${snapshot_dir} ${latest_dir}

    # 执行rsync备份命令
    rsync \
        --verbose \
        --progress \
        --human-readable \
        --archive \
        --delete \
        --backup \
        --backup-dir=${snapshot_dir} \
        --log-file=${bkp_dir}/${NOW}-rsync.log \
        ${src}/ ${latest_dir}/
done

关键逻辑说明

  • 关联数组管理源与目标:用BKP_SOURCES数组把每个源路径和对应的目标子目录绑定,以后要加新的备份源,直接在数组里加一行就行,非常灵活。
  • 独立备份路径:每个源都有自己的bkp_dir(比如/mnt/backup/docker),快照和latest都存放在这个路径下,不会和另一个源的备份混淆。
  • rsync参数作用:
    • --backup + --backup-dir:把同步过程中被替换或删除的旧文件备份到当天的快照目录里,实现历史版本留存。
    • --delete:让latest目录和源目录保持完全一致,删除源目录里已经不存在的文件。
    • 源路径末尾的/:确保rsync把源目录里的内容同步到latest,而不是在latest下多建一层源目录(比如不会出现latest/docker/xxx)。

最终目录结构

执行这个脚本后,你会得到完全符合预期的备份结构:

/mnt/backup
├── docker
│   ├── 240520-14h30m00s  # 当天生成的历史快照
│   ├── latest             # 同步后的最新备份内容
│   └── ...(其他日期的快照目录)
└── volumes
    ├── 240520-14h30m00s
    ├── latest
    └── ...(其他日期的快照目录)

额外小提示

如果想要自动清理旧快照(比如只保留最近7天的),可以在循环里添加这段代码:

# 删除7天前的快照目录
find ${bkp_dir} -maxdepth 1 -type d -name "[0-9]*-[0-9]*h[0-9]*m[0-9]*s" -mtime +7 -exec rm -rf {} \;

备注:内容来源于stack exchange,提问作者Frederic B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 13:53:14