在文档中,它提到这些是包含要包含的模式或要排除的模式的列表的文件。然而,这意味着包含,一切都被认为是排除,除非事物匹配模式。所以例如,一个包含文件的包含:
/opt/**.cfg
应该只包含任何名为* .cfg的文件,该文件位于树中的名为opt any目录的任何位置。所以它会匹配以下内容:
/opt/etc/myfile.cfg /some/dir/opt/myfile.cfg /notopt/opt/some/other/dir/myfile.cfg
因此,我希望它隐含地排除任何其他内容。但是似乎并非如此,因为我在逐项输出中看到这一点:
*deleting etc/rc.d/init.d/somescript
那么包括从和排除的交易是什么?它们是否只是过滤器的别名?
rsync不能这样工作。任何包含与任何包含或排除模式不匹配的文件名模式的文件都被认为包含在内。换句话说,将包含模式看作是排除模式的一种方式。
从docs:
Rsync构建命令行中指定的include / exclude选项的有序列表。 Rsync依次对每个排除/包含模式检查每个文件和目录名称。第一个匹配模式被采用。如果是排除模式,那么该文件将被跳过。如果是包含模式,则不会跳过该文件名。如果没有找到匹配的包含/排除模式,那么文件名不被跳过。
(重点是我)
所以,如果你只想包括特定的文件,你首先需要包括这些特定的文件,然后排除所有其他文件:
--include="*/" --include="*.cfg" --exclude="*"
几件事情要注意:
>包含模式必须在排除之前,因为匹配的第一个模式是被考虑的模式。如果文件名首先与排除模式匹配,则会被排除。
>您需要单独包含所有子目录,如所有子目录中的–include =“/ opt”–include =“/ opt / dir1”等,或者使用–include =“* /”来包含所有目录不是文件)。我为了简洁而选择了第二个选择。
它很古怪,不是很直观。所以仔细阅读docs(链接中的“EXCLUDE PATTERNS”部分),并使用–dry-run或-n选项来确保它会做你认为应该做的事情。