理解 rsync 的包含/排除模式

理解 rsync 的包含/排除模式

我想从远程系统传输 N 个文件,使用以下模式:

ssh remote ls target/
2013-08-01.mjson.gz
2014-07-04.mjson.gz
2014-07-09.mjson.gz
2014-08-12.mjson.gz
...

我只想要2014-07*文件。我迄今为止的尝试:

rsync -a --dry-run --verbose --include="2014-07-*" remote:target .
# transfers everything

rsync -a --dry-run --verbose --include="2014-07-*" --exclude="*" remote:target .
# transfers nothing

rsync -a --dry-run --verbose --exclude="*" --include="2014-07-*" remote:target .
# transfers nothing

rsync -a --dry-run --verbose --include="*/2014-07-*" --exclude="*" remote:target .
# transfers nothing

rsync -a --dry-run --verbose --include="***/2014-07-*" --exclude="*" remote:target .
# transfers nothing

我知道我可以使用 --files-from 来指示我想要的文件,但这样做很麻烦。

我一直不明白如何正确使用include/exclude来做我想做的事情。手册页指出:

并根据第一个匹配的模式进行操作:如果它是一个排除模式,那么就会跳过该文件;如果它是一个包含模式,那么就不会跳过该文件名;如果找不到匹配的模式,那么就不会跳过该文件名。

读到这里,我推测如果包含是第一个,并且文件名匹配,那么“文件名不被跳过”部分就会启动。显然,我错了。

在手册页的下方,我看到:

请注意,当使用 --recursive (-r) 选项(由 -a 暗示)时,每个路径的每个子组件都会从上到下访问,因此包含/排除模式会递归应用于每个子组件的全名

因为我使用了--recursive,是否.因为全局排除而导致被跳过?

如何使用包含和排除模式传输文件子集?

答案1

虽然您可以使用包含和排除,但我认为这将是一个更简单的解决方案:

rsync -a --dry-run --verbose remote:'target/2014-07*' .

您的包含/排除变体不起作用的原因是 rsync 永远不会进入目录,target因为它被模式排除*,并且不与包含模式匹配(仅匹配中的文件target,而不是target其本身)。要使包含/排除起作用,您必须执行类似

rsync -a --dry-run --verbose --include=target --include='target/2014-07-*' --exclude='*' remote:target .

相关内容