我想使用以下模式从远程系统传输 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
...
Run Code Online (Sandbox Code Playgroud)
我只想要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
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用 --files-from 来指示我想要的文件,但这样做很痛苦。
我从来不明白如何正确使用包含/排除来做我想做的事。手册页指出:
并且对第一个匹配模式起作用:如果它是排除模式,则跳过该文件;如果是包含模式,则不会跳过该文件名;如果没有找到匹配的模式,则不会跳过文件名。
读到这里,我假设如果首先包含,并且文件名匹配,那么“文件名不被跳过”部分就会开始。显然,我错了。
在手册页的进一步下方,我看到:
请注意,当使用 --recursive (-r) 选项(由 -a 隐含)时,每个路径的每个子组件都是从上到下访问的,因此包含/排除模式会递归地应用于每个子组件的全名
由于我使用了--recursive,是否会.因为全局排除而被跳过?
如何使用包含和排除模式传输文件子集?
pel*_*lle 12
虽然您可以使用包含和排除,但我认为这将是一个更简单的解决方案:
rsync -a --dry-run --verbose remote:'target/2014-07*' .
Run Code Online (Sandbox Code Playgroud)
您的包含/排除变体不起作用的原因是 rsync 永远不会下降到target目录中,因为它被*模式排除并且不与包含模式匹配(仅匹配 中的文件target,而不匹配target本身)。为了包含/排除工作,你必须做类似的事情
rsync -a --dry-run --verbose --include=target --include='target/2014-07-*' --exclude='*' remote:target .
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22191 次 |
| 最近记录: |