我想从远程系统传输 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 .