32

在文档中,它提到这些是包含要包含的模式或要排除的模式列表的文件。但是,这意味着对于包含项,除了匹配模式的情况外,所有内容都被视为排除项。例如,一个包含文件包含:

/opt/**.cfg

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

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

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

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

那么--include-from和有什么关系--exclude-from呢?他们只是别名--filter-from吗?

4

2 回答 2

95

rsync不能那样工作。任何文件名模式与任何包含或排除模式都不匹配的文件都被视为包含在内。换句话说,将包含模式视为覆盖排除模式的一种方式。

文档(强调我的):

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

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

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

这里需要注意几点:

  1. 模式必须出现在排除之前,因为第一个匹配的include模式是被考虑的模式。如果文件名首先匹配排除模式,它将被排除。

  2. 您需要单独包含所有子目录,例如--include="/opt" --include="/opt/dir1"所有子目录的等,或者使用 --include="*/" 包含所有目录(不是文件)。为简洁起见,我选择了第二个选项。

它很古怪而且不是很直观。因此,请仔细阅读文档(链接中的“排除模式”部分)并使用--dry-runor-n选项来确保它会执行您认为应该执行的操作。

于 2013-10-10T12:58:45.300 回答
6

如果您(像我一样)很难FILTER RULES理解手册页中的 - 部分,但对 . 有基本的了解find,您可以改用它。

2016-02-01假设您想将文件名或目录名中的特定日期(例如)同步/storage/data到 to rsync_test。做这样的事情:

cd /storage/data
find . -name '*2016-02-01*' \
  | rsync --dry-run -arv --files-from=- /storage/data /tmp/rsync_test
于 2016-02-11T13:27:03.207 回答