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

Cra*_*aig 25 unix bash rsync

在文档中,它提到这些文件是包含要包含的模式或要排除的模式的列表的文件.然而,这意味着包含物,除了物质匹配模式之外,一切都被认为是排除.例如,包含以下内容的包含文件:

/opt/**.cfg
Run Code Online (Sandbox Code Playgroud)

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

/opt/etc/myfile.cfg
/some/dir/opt/myfile.cfg
/notopt/opt/some/other/dir/myfile.cfg
Run Code Online (Sandbox Code Playgroud)

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

*deleting   etc/rc.d/init.d/somescript
Run Code Online (Sandbox Code Playgroud)

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

Har*_*non 83

rsync不是这样的.任何文件名模式与任何包含或排除模式都不匹配的文件都被视为包含在内.换句话说,将包含模式视为重写排除模式的一种方式.

来自文档:

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

(强调我的)

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

--include="*/" --include="*.cfg" --exclude="*"
Run Code Online (Sandbox Code Playgroud)

这里要注意的事情:

  1. include模式要来的前排除,因为第一个匹配的模式是被考虑的一个.如果文件名首先与排除模式匹配,则会将其排除.

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

它古怪而且不太直观.因此,请仔细阅读文档(链接中的"EXCLUDE PATTERNS"部分)并使用--dry-run-n选项确保它能够执行您认为应该执行的操作.

  • 这是迄今为止我见过的奇怪的rsync规则的最佳解释. (5认同)
  • 实际上,即使我的样本也行不通.因为`exclude =*`排除了所有内容,这是第一个匹配的模式,所以没有任何东西被转移.我已将其更改为首先包含包含模式. (4认同)
  • 不要忘记`-m`以避免创建空目录的巨大树. (2认同)

Ulf*_*lfR 5

如果您(像我一样)很难FILTER RULES在手册页的-section 周围缠上头,但是对有了基本的了解find,则可以改用它。

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

cd /storage/data
find . -name '*2016-02-01*' \
  | rsync --dry-run -arv --files-from=- /storage/data /tmp/rsync_test
Run Code Online (Sandbox Code Playgroud)