Copiando apenas links simbólicos específicos com o rsync?

Copiando apenas links simbólicos específicos com o rsync?

Tenho uma estrutura de pastas que desejo copiar usando rsync, cuja estrutura é uma série de backups dos quais desejo copiar apenas o mais recente (que pode ser identificado por meio de um link simbólico), assim:

/backups
    /foo
        /2019-05-01
        /2019-06-01
        /latest -> 2019-06-01
    /bar
        /2019-05-20
        /2019-06-20
        /latest -> 2019-06-20

E assim por diante; o que eu gostaria de fazer é, usando um único comando rsync, copiarapenaso latestbackup de cada pasta, enquanto imita a estrutura. Para isso criei o seguinte comando:

rsync -rptgoDLm --include '*/' --include '/*/latest/**' --exclude '*' user@remote:/backups /some/local/path

Basicamente, um arquivo com --copy-linksalguns truques de inclusão/exclusão para selecionar apenas as /*/*/latestramificações (além -mde evitar um monte de estruturas de diretório vazias). Isso funciona bem, exceto por um problema; se alguma dessas ramificações contiver links simbólicos, eles também serão copiados como seus alvos, em vez de apenas links simbólicos simples.

O que eu realmente preciso ser capaz de fazer éapenasuse --copy-linkso comportamento com os latestlinks simbólicos, enquanto usa outro comportamento (por exemplo, o de --links) para quaisquer outros que sejam encontrados.

Isso é possível com um único comando rsync? Meu objetivo é ser capaz de executar isso sem precisar saber qual /backupsé o conteúdo imediato, de modo que se eu adicionar algo novo (por exemplo- /backups/baz), ele será copiado automaticamente.

Atualizar: Para esclarecer, a estrutura de diretórios resultante que gostaria de ver no destino seria:

/backups
    /foo
        /latest
    /bar
        /latest

ou seja, eu só preciso da versão mais recente de cada backup no destino (o próprio destino manipulará o histórico de backup de outra maneira).

Responder1

Isso parece atender às suas necessidades

rsync -avR user@remote:'/backups/*/latest/' /some/local/path/

O -Rsinalizador "copia" efetivamente todo o caminho de origem para o destino e os backups resultantes serão direcionados como arquivos /some/local/path/backups/{whatever}/latest.

Se você achar que não deseja o caminho de origem completo, poderá incluir /./para indicar o ponto de onde o caminho deve ser copiado até o destino. Por exemplo, /backups/./foo/latest/resultaria em /some/local/path/foo/latest/(ou seja, o /backupscomponente foi ignorado). Há muito mais detalhes na documentação ( man rsync).

informação relacionada