另一种解决方案在这里不起作用。
可靠的方式
你别无选择,只能手动下降为您的子目录,每个级别。包含不需要的文件没有风险,因为rsync不包括包含目录的文件。
1)创建一个包含过滤器文件,例如 “include_filter.txt”:
+ /specs/
+ /specs/install/
+ /specs/install/project1/***
- /specs/**
2)运行它:
rsync -avz --delete --include-from=include_filter.txt \
/srv/http/projects/project/ \
[email protected]:~/projects/project
- 不要忘了启动斜杠“/ “,否则你可能会匹配名为”**/specs/install/project1 /“的子目录。
- 通过选择包含类型过滤器(--include-from = FILE),启动加“+”符号实际上是可选的,因为这是没有符号的默认操作。 (默认情况下,您可以使用--exclude-from = FILE来设置相反的“ - ”。)
- 的双星 “**” 是指 “任何路径”
- 的三连星 “***” 是指 “任何路径,包括这个非常目录”
简单的方法
你可以开始你的过滤器“* /”,允许rsync下降你所有的子级别。这很方便,但是:
- 所有目录都将被包括在内,尽管为空。这可以通过rysnc选项-m修复,但是所有空的目录都会被跳过。
1)创建一个包含过滤器文件,例如 “include_filter.txt”:
+ /**/
+ /specs/install/project1/***
- /specs/**
2)运行它:
rsync -avzm --delete --include-from=include_filter.txt \
/srv/http/projects/project/ \
[email protected]:~/projects/project
注意添加的选项-m。
刚刚在linuxquestions.org上找到了一个类似的问题,可能有所帮助:http://www.linuxquestions.org/questions/linux-software-2/rsync-include-exclude-problems-636504/ – Chris
谢谢,解决了它!有时Rsync确实有一个奇怪的逻辑。 – user1036651
Duplicates http://stackoverflow.com/questions/7960669/with-rsync-how-do-includes-and-excludes-combine/7961687#7961687 –