混合增量备份与同步备份的可维护实现方案咨询
这个需求其实挺常见的,我之前也帮朋友处理过类似的场景,给你几个可维护性强的方案,你可以根据自己的目录结构和使用习惯来选:
方案一:目录拆分法(最直观易维护)
最简单的方式就是把源目录拆成两个明确的子目录:
source/sync_content:存放需要**完全同步(删源即删目标)**的文件source/add_only_content:存放需要**只增不减(删源不删目标)**的文件
然后分别执行两个rsync命令:
- 同步删除型备份:
rsync --delete -av /path/to/source/sync_content/ /path/to/dest/sync_content/
--delete参数会让目标目录完全跟上源目录的变化,源里删了的文件,目标也会删掉;-av是归档模式+显示详细信息,能保留文件权限、时间戳等属性。
- 只增型备份:
rsync -av --ignore-existing /path/to/source/add_only_content/ /path/to/dest/add_only_content/
--ignore-existing会跳过目标里已经存在的文件,只把源里新增的文件复制过去,哪怕源里删了旧文件,目标里的版本也会保留。
这个方案的好处是逻辑清晰,几乎不会出错,后期维护的时候一眼就能分清哪些内容是哪种备份策略,新手也能快速上手。
方案二:rsync过滤规则法(无需改动现有目录结构)
如果不想调整现有的目录结构,可以用rsync的include/exclude规则来区分两种文件:
比如假设你的源目录里,docs/是需要同步删除的,photos/是只增不减的,那可以分两次执行rsync:
- 同步删除指定目录:
rsync --delete -av --include='docs/***' --exclude='*' /path/to/source/ /path/to/dest/
这里的规则是“先包含docs下的所有内容,再排除其他所有内容”,确保只处理docs目录,并且同步删除。
- 只增备份指定目录:
rsync -av --ignore-existing --include='photos/***' --exclude='*' /path/to/source/ /path/to/dest/
同理,只处理photos目录,且只新增不删除。
如果规则比较复杂,还可以把过滤规则写到一个文件里,比如filter_sync.txt:
+ /docs/*** - *
然后用--filter='merge filter_sync.txt'参数来调用,命令会更简洁:
rsync --delete -av --filter='merge filter_sync.txt' /path/to/source/ /path/to/dest/
注意:rsync的过滤规则顺序很重要,先写include再写exclude,不然会出现规则不生效的情况。
方案三:脚本自动化封装(一键执行,定期备份)
不管用上面哪种方案,都可以把命令封装成shell脚本,方便一键执行,甚至可以用定时任务自动备份。
比如写一个mixed_backup.sh:
#!/bin/bash # 定义源目录和目标目录 SOURCE="/home/yourname/source_root" DEST="/mnt/external_drive/backup" # 同步删除型备份(先加-n参数测试,确认没问题后再去掉-n) rsync --delete -avn "$SOURCE/sync_content/" "$DEST/sync_content/" # 只增型备份 rsync -av --ignore-existing "$SOURCE/add_only_content/" "$DEST/add_only_content/" # 记录备份时间到日志 echo "Backup finished at $(date '+%Y-%m-%d %H:%M:%S')" >> "$DEST/backup_log.txt"
然后给脚本加执行权限:
chmod +x mixed_backup.sh
额外注意事项
- 测试优先:所有rsync命令都可以先加
-n(--dry-run)参数,模拟执行过程,确认不会误删文件再正式运行。 - 权限检查:确保你的用户对源目录和外部驱动器有读写权限,不然rsync会报错。
- 日志记录:在脚本里加上日志输出,方便后续排查备份是否成功。
- 定时任务:如果需要定期备份,可以用
cron(Linux/macOS)或者任务计划(Windows)来自动运行脚本。
备注:内容来源于stack exchange,提问作者Alexandru Dinu

