【问题标题】:rsync: --include-from vs. --exclude-from what is the actual difference?rsync: --include-from 与 --exclude-from 的实际区别是什么?
【发布时间】:2013-10-18 05:42:57
【问题描述】:

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

/opt/**.cfg

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

/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 的别名吗?

【问题讨论】:

    标签: bash unix rsync


    【解决方案1】:

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

    来自docs(强调我的):

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

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

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

    这里有几点需要注意:

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

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

    它很古怪而且不是很直观。因此,请仔细阅读docs(链接中的“排除模式”部分)并使用--dry-run-n 选项来确保它会按照您的想法进行操作。

    【讨论】:

    • 这是有道理的。我实际上是在使用它来验证排除和包含列表范围之外没有不明确的文件。我首先将所有内容都排除在外,并且只同步显式包含内容。然后我运行相同的命令,这次包含所有内容,只有明确的排除没有同步。然后对逐项日志进行比较,并且将显示任何不匹配任何模式的模棱两可的文件。这样可以确保不会意外修改任何内容。
    • 实际上,即使是我的示例也行不通。因为exclude=* 排除了所有内容,这是第一个匹配模式,所以没有任何内容被传输。我已将其更改为首先包含包含模式。
    • 最后--filter="merge exclude_list"--filter="merge include_list" 就足够了。我在每个底部创建了一个隐式规则来排除/包含任何不匹配的内容。它现在按预期运行。谢谢!
    • 这是迄今为止我看到的奇怪的 rsync 规则的最好解释。
    • 不要忘记-m 以避免创建巨大的空目录树。
    【解决方案2】:

    如果您(像我一样)难以理解手册页中的 FILTER RULES-部分,但对 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 2012-10-25
      • 1970-01-01
      相关资源
      最近更新 更多