Copie o link simbólico E para onde ele aponta para o uso do rsync

11

Isso não precisa ser feito rsync, mas seria bom não ter que escrever um script para fazer isso e rsyncestá muito próximo do que eu quero.

rsync -a(ou -l) pode preservar links simbólicos e -Lpode desreferenciar links simbólicos e copiá-los como se fosse um arquivo / diretório normal. No entanto, é possível manter o link simbólico e também copiar os arquivos / diretórios para os quais os links apontam?

Aqui está um exemplo. Digamos que temos esta hierarquia de pastas:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirB/not_this_file
dirC/file
dirC/file2
dirD/others

e quando eu fizer rsync -aR dirA dest(ou qualquer outra coisa), gostaria que elas aparecessem exatamente em dest:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirC/file
dirC/file2

Isso é possível com rsync? Obrigado.

Vamos supor que links simbólicos com caminho absoluto ou apontar para fora do diretório de origem possam ser ignorados.

Wei-Yin
fonte
1
Acho que sua solicitação está subespecificada: você exige que, se dirA/linkfor um link simbólico ../dirB/file, isso deve ser tratado como cópia dirB/filepara dest/dirB/filee dirA/linkpara dest/dirA/link. E se dirA/linkfor um link para ../../another_file? O que acontece, em geral, se dirA/linkaponta para um diretório mais alto na árvore de diretórios?
Riccardo Murri 14/10
Boa pegada. No meu caso de uso, não há ponto de link para fora da árvore e não há caminho absoluto nos links.
Wei-Yin
1
Quanto mais eu penso sobre isso, mais acho que nenhum utilitário padrão fará isso. No caso geral, ele pode precisar de criar um grande número de destinos dada uma única fonte, se você tem um link simbólico para um link simbólico ou, mais geralmente um link simbólico cujo destino contém um link simbólico (por exemplo a -> b, b -> c/foo, c -> d/e: um pedido de cópia atambém deve copiar b, c, c/foo, d, d/ee d/e/foo).
Gilles 'SO- stop be evil'
@ Gilles: Sim, você está certo. Os links de rastreamento podem levar à inclusão de muitos arquivos, desde que ainda estejam dentro do diretório de origem.
Wei-Yin

Respostas:

2

Se você conhece o nome do link simbólico e deseja transferir o link e o destino, pode:

rsync -a 'symlink' .
realdir="$(basename "$(readlink -f 'symlink')")"
rsync -a "$realdir" .

As primeiras rsynctransferências apenas o symlink. O segundo comando localiza o nome do diretório real e o segundo rsynctransfere o conteúdo do diretório.

user201564
fonte
0

Isso seria possível se, e somente se, todos estivessem em 'mydir' e sincronizassem 'mydir' de um lugar para outro. O Rsync não é capaz de copiar fora do caminho especificado (com exceção dos links a seguir). por exemplo

mydir/dirA ...
mydir/dirB ...
...
xenoterracida
fonte
Sim, essa suposição se encaixa no meu caso de uso. Todos os links estão dentro de mydir.
Wei-Yin
@ Wei-Yin então simplesmente dizer que não seguir links simbólicos ... ou ter I mal entendido alguma coisa
xenoterracide
@xenoterracide: Não importa como você invoque o rsync, acho que ele criará um único destino para cada fonte (exceto a criação dos principais diretórios). Mas o Wei-Yin quer criar dois ou mais destinos: o link e seu destino.
Gilles 'SO- stop be evil'
aparentemente estou confuso ...
xenoterracide 14/10
@ Gilles: não é necessário que o rsync siga o link simbólico, pois ele sincronizará o destino de qualquer maneira . Portanto, ele primeiro copia o link simbólico, criando um link simbólico danificado. Em seguida, ele copia todo o resto do diretório, incluindo o destino do link simbólico. Voila, tudo se encaixa muito bem.
Martin v. Löwis 30/10/10