机器之间的Rsync不一致

我刚刚开始尝试使用rsync从一些Linux机器进行一些备份到运行备份系统其余部分的Windows服务器。 经过大量的阅读和试​​验后,我终于可以在一台Linux机器(Centos)上运行了,所以我把脚本复制到另一台机器上(Debian),编辑了一些path并试图运行它。 而不是运行它在第一台机器上的方式,我得到以下结果:

building file list ... 1 file to consider sent 36 bytes received 16 bytes 11.56 bytes/sec total size is 0 speedup is 0.00 

有问题的脚本是:

 #! /bin/sh /usr/bin/rsync \ --progress \ --recursive \ -t \ --delete-excluded \ --filter="- .cpan/***" \ --filter="- include/***" \ --filter="- cache/***" \ --filter="- lib/***" \ --filter="- cvs/***" \ --filter="+ /BayesTraining/***" \ --filter="+ /BogoTraining/***" \ --filter="+ /etc/***" \ --filter="+ /var/***" \ --filter="+ /root/***" \ --filter="+ /boot/***" \ --filter="+ /usr/local/***" \ --filter="+ /home/***" \ --filter="- *" \ / \ rsync://myserver/targetfolder 

它只会开始发送文件,如果我删除了最后一个filter参数,但它发送了一大堆比我想要的。

我在哪里塞了,我需要改变什么? (之前有人问,我没有通过SSH使用rsync,因为Windows服务器还没有一个SSH服务,小步骤…)

编辑: rsync – 版本显示

 Centos: rsync version 2.6.8 protocol version 29 Debian: rsync version 2.6.4 protocol version 29 

解决scheme:感谢pavium指出我忽略了手册页中的一个关键部分(为了可读性而重新格式化):

 a trailing "dir_name/***" will match both the directory (as if "dir_name/" had been specified) and everything in the directory (as if "dir_name/**" had been specified). This behavior was added in version 2.6.7. 

解决scheme是为我想包含的每个目录创build以下规则:

 --filter="+ /dirname/" --filter="+ /direname/**" 

最后的filter项目可能是你的问题(嗯,我想你知道 )。 我在rsync 2.6.9手册页中find了以下内容:

请注意,使用–recursive(-r)选项(由-a暗示)时,每个path的每个子组件都是从上到下访问的,因此包含/排除模式将recursion应用于每个子组件的全名(例如为了包含“/ foo / bar / baz”,子组件“/ foo”和“/ foo / bar”不能被排除)。 当rsyncfind要发送的文件时,排除模式实际上使目录遍历阶段短路。 如果一个模式排除了一个特定的父目录,它可以无效地渲染一个更深的包含模式,因为rsync不会通过该层次结构的排除部分下降。 当使用尾随的“*”规则时,这是特别重要的。 例如,这不起作用:

 + /some/path/this-file-will-not-be-found + /file-is-included - * 

因为父目录“some”被“*”规则排除,所以rsync从不会访问“some”或“some / path”目录中的任何文件。 一种解决方法是通过使用单个规则来请求层次结构中的所有目录:“+ * /”(将其放在“ – *”规则之前),或者使用–prune-empty-dirs选项。 另一种解决scheme是为所有需要访问的父级目录添加特定的包含规则。 例如,这套规则工作正常:

 + /some/ + /some/path/ + /some/path/this-file-is-found + /file-also-included - * 

所以, – *排除了之前没有明确包含在过滤规则中的path。 手册页还告诉我,在版本2.6.7中添加了“dir_name / ***”行为(这启用这些path)(您的Debian是较早的)

精神debugging模式激活:

Bash可能将*扩展为当前目录中所有文件的列表,所以rsync不会看到*它看到file1 file2 file3

尝试转义*--filter="- \*" \ ,或--filter='- *' \应该做的伎俩。

在CentOS和Debian框上运行“rsync –version”,并比较结果。 Debian可能更老一些吗? 这可能是这个特定版本的错误,也可能是它在这个盒子上的编译方式。