如何使用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.
相关产品推荐
相关产品推荐

