可能的重复:
Rsync 过滤器:仅复制一种模式
我想使用 rsync 从服务器(或服务器通过 ssh)传输具有特定结束字符串的所有文件,例如文件类型扩展名,如tar.gz
.我想要它们全部,无论它们现在或将来有多深。但这不仅仅是延伸。在一种情况下,我想获取所有以-server-cloudimg-amd64-root.tar.gz
.同样重要的是,我根本不想获取任何其他文件,即使它们位于较浅的路径中。
简单的情况--include="**/*-server-cloudimg-amd64-root.tar.gz
并没有得到他们。我确实知道 rsync 包含/排除并不简单,但没想到它会起作用。我知道需要指定要传输的目录。但 rsync 的逻辑对我来说一直是个谜(不像我见过的任何路径 ACL 规则),因为它还需要单独匹配父目录。我认为所需要的只是一个选项,其语义是“如果该文件匹配,则包含所有必要的目录以使其传输,而不暗示任何其他匹配”,与命令mkdir -p ${DIRNAME}
创建指定目录的父目录的方式大致相同需要。我在 rsync 中没有看到这样的选项。有没有一些简单的方法可以一次性完成此操作?
答案1
在这种情况下,当您无法物理访问远程服务器时,您必须联系所有包含和排除的内容。这里有一篇关于 SE 的优秀帖子(请参阅精选答案):
我认为你需要类似的东西
rsync -am --include='*.tar.gz' --include='*/' --exclude='*' SOURCE DESTINATION
答案2
你想使用find
:
find /top/level/path -name '*.tar.gz' -exec rsync {} +
top/level/path
是顶级目录,搜索将在其所有子目录中执行。如果您想缩小搜索范围,可以使用-maxdepth
或选项,并使用或等通配符。-mindepth
?
*
-name
您当然可以添加其他选项rsync
,例如rsync -av
.最后一部分 -- {} +
-- 将命令找到的文件列表提供给 rsync find
。
如果您想查看将传递给 rsync 的文件列表,您可以通过 sybstitutingrsync
使用以下命令来测试它echo
:
find /top/level/path -name '*.tar.gz' -exec echo {} +