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 latest
backup 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-links
alguns truques de inclusão/exclusão para selecionar apenas as /*/*/latest
ramificações (além -m
de 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-links
o comportamento com os latest
links 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 -R
sinalizador "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 /backups
componente foi ignorado). Há muito mais detalhes na documentação ( man rsync
).