rsync: - include-from与--exclude-来自实际差异是什么?

时间:2013-10-10 12:48:48

标签: bash unix 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

那么与--include-from--exclude-from的交易是什么?它们只是--filter-from的别名吗?

2 个答案:

答案 0 :(得分:80)

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

来自docs

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

(强调我的)

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

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

这里需要注意的事情:

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

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

  3. 它古怪而且不太直观。因此,请仔细阅读docs(链接中的“排除模式”部分)并使用--dry-run-n选项确保它能够执行您认为应该执行的操作。

答案 1 :(得分:4)

如果你(像我一样)很难绕过man-pages中的FILTER RULES - 部分,但对find有一个基本的了解,你可以改用它。< / p>

假设您希望将文件名中的特定日期(ex 2016-02-01)与/storage/datarsync_test的目录名称同步。做这样的事情:

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