我刚刚开始尝试使用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可能更老一些吗? 这可能是这个特定版本的错误,也可能是它在这个盒子上的编译方式。