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

duplicity+rsync使用--rsync-options仍备份排除文件的问题排查

问题分析与修复方案

我一眼就看出你这问题出在rsync规则的顺序逻辑和shell参数解析两个核心点上,咱们一步步拆解清楚:

1. rsync 匹配规则顺序搞反了

rsync的--include/--exclude是按从左到右的顺序匹配,一旦某个规则匹配成功就停止后续检查。你现在的写法是先排除文件,再写--include="*/"和--include="*"——这两个include规则会直接覆盖前面的排除!

  • --include="*"会匹配所有文件(包括你要排除的Backup归档),所以rsync看到这个规则时,会把之前被排除的文件又重新纳入复制列表,等于你的排除规则白写了。

正确的逻辑顺序应该是:

  1. 先--include="*/":确保rsync会遍历所有子目录(否则它可能跳过某些目录,连里面的文件都看不到)
  2. 然后写你的排除规则:把那些Backup相关的归档文件排除掉
  3. 最后--include="*":包含所有没被排除的文件

2. shell大括号展开被引号“封印”了

你写的--exclude="*Backup*."{zip,tar,xz}是想让shell把大括号展开成三个独立的排除规则,但因为整个参数被双引号包裹了,shell根本不会处理这个大括号!rsync收到的规则是*Backup*.{zip,tar,xz},它不认识这个语法,自然匹配不到任何文件,排除规则完全失效。

解决这个的办法有两个:

  • 把大括号放到双引号外面,让shell正常展开;
  • 直接分开写三个--exclude参数,更直观也不容易出错。

3. 嵌套引号的解析问题

你在--rsync-options里用了双引号套双引号(--exclude="*Backup*."...),这会导致shell提前闭合外层的双引号,后面的参数被错误解析,进一步导致规则失效。建议内部规则用单引号包裹,避免冲突。


修复后的命令

这里给你两种可行的写法,选哪种都可以:

写法1:分开写排除规则(更稳妥)

duplicity --encrypt-key somekey --verbosity 8 --rsync-options "-avPt --delete --delete-excluded --include='*/' --exclude='*Backup*.zip' --exclude='*Backup*.tar' --exclude='*Backup*.xz' --include='*' --rsync-path='sudo rsync'" source dest

写法2:利用shell大括号展开(简洁)

duplicity --encrypt-key somekey --verbosity 8 --rsync-options "-avPt --delete --delete-excluded --include='*/' --exclude='*Backup*.'"{zip,tar,xz}" --include='*' --rsync-path='sudo rsync'" source dest

最后再划个重点

  • rsync的规则顺序永远是先保证目录可遍历,再排除目标,最后包含剩余;
  • 传递带特殊字符或shell语法的参数时,一定要注意引号的嵌套和解析问题;
  • 如果还是不确定规则是否生效,可以先用rsync --dry-run单独测试rsync的参数,确认没问题再放到duplicity里。

内容的提问来源于stack exchange,提问作者Gregor Isack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 00:27:41