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?

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" [...]


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.