仅使用 rsync 复制特定的符号链接?

Har*_*ikk 2 rsync

我有一个要使用 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)

即-我只需要目标上每个备份的最新版本(目标本身将以另一种方式处理备份历史记录)。

roa*_*ima 5

这似乎符合您的要求

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) 中有更多详细信息。