Como rsync um diretório para um novo diretório com nome diferente?

49

Estou fazendo uma transferência de dados, o sistema de arquivos antigo depende profundamente de um diretório que agora está em um caminho diferente. Este é um diretório git que armazena código online. Não tenho direitos para movê-lo ou renomeá-lo.

Então, o que posso fazer é sincronizar novamente este diretório com o mesmo caminho antigo. Mas o nome do diretório também mudou.

Existe uma maneira fácil de sincronizar um diretório para um diretório de destino com um nome diferente?

zen
fonte

Respostas:

83

Se você deseja usar rsyncpara tornar recursivamente o destdiretório, uma cópia exata do srcdiretório:

rsync -a src/ dest

A rsyncpágina do manual explica como isso funciona:

Uma barra à direita na fonte evita [...] criar um nível de diretório adicional no destino. Você pode pensar em uma trilha /na fonte como significando "copiar o conteúdo deste diretório" em vez de "copiar o diretório pelo nome" [...]

Adrian
fonte
3
Isso criará um srcdiretório no destdiretório
Zen
7
@ Zen, não em nenhuma versão rsyncque eu já usei. Se isso realmente está acontecendo com você, você está perdendo a barra no final do argumento do diretório de origem.
Adrian
3
Essa barra final sorrateira é CHAVE ...
Tutuca
infelizmente isso parece não funcionar se destfor um symlnk src, mas acaba sendo copiado srcpara src/src. Testado no macOS. Estava esperando que eu poderia substituir bar -> foo/com bar/, mas teve que usar um diretório temporário intermediário.
User5359531
@ user5359531 Se você sabe que desté um link simbólico src, simplesmente rm destantes de executar o comando acima. rsyncé inteligente o suficiente para criar destantes de copiar o conteúdo de src. Você não precisa de um diretório temporário intermediário.
Adrian
1

Se os sistemas de arquivos antigos e novos estiverem acessíveis à sua máquina, considere usar um link simbólico em vez de rsync. Se o comando rsync que você estiver usando não especificar hosts (ou se eles forem o mesmo host), esse é o caso. Você está tentando espelhar dois diretórios com um nome diferente no mesmo host. Não use o rsync para isso, pois você está duplicando os dados e precisará executar o rsync frequentemente para mantê-los sincronizados.

O uso de um link simbólico é uma correção única que espelha dois diretórios (com nomes diferentes) e quase não requer espaço. É como criar um diretório de alias que aponte para outro diretório.

Digamos que você tenha o git antigo em um diretório chamado / old / path / old_git e agora o repositório de código foi movido para / new / path / new_git

Você pode fazer:

cd /old/path
rm -rf old_git     (if you still have it there, get rid of it, or move it out of the way)  
ln -s /new/path/new_git old_git

Isso criará um link como tal:

/ old / path / old_git -> / novo / caminho / new_git

Para que tudo o que for colocado no new_git também esteja instantaneamente disponível da maneira antiga, sem duplicar os dados e sem precisar sincronizá-los constantemente.

jrel
fonte
11
Cuidado com o comando rm -rf old_git. Isso removerá todo o repositório old_git. Se não estou entendendo direito o seu problema, isso pode ser uma coisa ruim.
jrel
0

Eu acho uma solução alternativa agora.

O uso rysnc -r /origin/* /target/pode sincronizar todo o conteúdo do diretório de origem para o diretório de destino.

zen
fonte
8
Eu acredito que este não inclui dot arquivos (.foo), porque estes não serão combinados com o asterisco
Ray Burgemeestre
que depende da expansão do shell glob, tecnicamente ele passará todos os arquivos encontrados lá como argumento para o rsync. é quase o mesmo que correr rsync -r $(find /origin -maxdepth 1 -type f) /target/ . Como o @RayBurgemeestre apontou, a expansão do shell glob não incluirá arquivos de ponto.
Florian Castellane