我有一个要使用 rsync 复制的文件夹结构,其中结构是一系列备份,我只想从中复制最新的(可以使用符号链接识别),如下所示:
/backups
/foo
/2019-05-01
/2019-06-01
/latest -> 2019-06-01
/bar
/2019-05-20
/2019-06-20
/latest -> 2019-06-20
Run Code Online (Sandbox Code Playgroud)
等等; 我想要做的是,使用单个 rsync 命令,只复制latest
每个文件夹中的备份,同时模仿结构。为此,我想出了以下命令:
rsync -rptgoDLm --include '*/' --include '/*/latest/**' --exclude '*' user@remote:/backups /some/local/path
Run Code Online (Sandbox Code Playgroud)
基本上是一个带有--copy-links
一些包含/排除技巧的存档,只选择/*/*/latest
分支(加上-m
避免一堆空目录结构)。除了一个问题外,这很好用;如果这些分支中的任何一个包含符号链接,那么它们也会被复制为它们的目标,而不仅仅是作为简单的符号链接。
我真正需要的是能够做的是只使用--copy-links
行为与latest
符号链接,同时使用(EG-是另一种行为--links
)对遇到的任何人。
使用单个 rsync 命令可以实现这样的事情吗?我的目标是能够运行它而不必知道它的直接内容/backups
是什么,这样如果我添加任何新内容(例如- /backups/baz
),它就会自动复制。
更新:澄清一下,我想在目的地看到的结果目录结构是:
/backups
/foo
/latest
/bar
/latest
Run Code Online (Sandbox Code Playgroud)
即-我只需要目标上每个备份的最新版本(目标本身将以另一种方式处理备份历史记录)。
这似乎符合您的要求
rsync -avR user@remote:'/backups/*/latest/' /some/local/path/
Run Code Online (Sandbox Code Playgroud)
该-R
标志有效地将整个源路径“复制”到目标中,生成的备份将作为/some/local/path/backups/{whatever}/latest
.
如果您发现不需要整个源路径,您可以包含/./
来指示路径应从哪个点复制到目标。例如,/backups/./foo/latest/
将导致/some/local/path/foo/latest/
(即/backups
组件已被跳过)。文档 ( man rsync
) 中有更多详细信息。