rsync: – 包括从 – 与 – 排除 – 从什么是实际的差异?

在文档中,它提到这些文件是包含要包括的模式或要排除的模式的列表的文件。 但是,这意味着包容性,除非事物模式匹配,否则一切都被认为是排除的。 例如,一个包含文件包含:

/opt/**.cfg 

应该只包含名为* .cfg的文件,该文件存在于名为opt的目录下的任何位置,在树中的任何位置。 所以它会匹配以下内容:

 /opt/etc/myfile.cfg /some/dir/opt/myfile.cfg /notopt/opt/some/other/dir/myfile.cfg 

因此,我希望它隐含地排除其他任何东西。 但这似乎并不是这样,因为我在分项输出中看到了这一点:

 *deleting etc/rc.d/init.d/somescript 

那么,包含和排除是什么呢? 他们只是filter-from别名吗?

rsync不能这样工作。 具有不匹配任何包含或排除模式的文件名模式的任何文件都被视为包括在内。 换句话说,将包含模式看作是压倒排除模式的一种方式。

从文档 :

Rsync会根据命令行上的指定构建包含/排除选项的有序列表。 Rsync会依次对每个排除/包含模式检查每个文件和目录名称。 第一个匹配模式起作用。 如果是排除模式,则跳过该文件。 如果它是一个包含模式,那么该文件名不会被跳过。 如果找不到匹配的包含/排除模式,那么文件名不会被跳过。

(强调我的)

因此,如果只想包含特定文件,则首先需要包含这些特定文件,然后排除所有其他文件:

 --include="*/" --include="*.cfg" --exclude="*" 

几件事要注意这里:

  1. include模式必须在排除之前,因为匹配的第一个模式是被考虑的模式。 如果文件名称首先与排除模式相匹配,则会被排除。

  2. 您需要单独包含所有子目录,如--include="/opt" --include="/opt/dir1"等等,或者使用–include =“* /”来包含所有目录文件)。 为了简洁起见,我使用了第二种方法。

这是古怪的,不是很直观。 因此,请仔细阅读文档 (链接中的“EXCLUDE PATTERNS”部分),并使用--dry-run-n选项来确保它将执行您认为应该执行的操作。

如果你(像我一样)很难把头围绕在手册页的FILTER RULES -section上,但对find有一个基本的了解,你可以用它来代替。

假设您要在文件名中或从/storage/datarsync_test的目录名中同步每个特定日期(例如2016-02-01 )。 做这样的事情:

 cd /storage/data find . -name '*2016-02-01*' \ | rsync --dry-run -arv --files-from=- /storage/data /tmp/rsync_test