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