Sincronização bidirecional com rsync


95

Eu tenho uma pasta a / e uma pasta remota A /. Agora eu executo algo assim em um Makefile:

get-music:
 rsync -avzru server:/media/10001/music/ /media/Incoming/music/

put-music:
 rsync -avzru /media/Incoming/music/ server:/media/10001/music/

sync-music: get-music put-music

quando eu faço sync-music, ele primeiro pega todos os diffs do servidor para o local e depois o oposto, enviando todos os diffs do local para o servidor.

Isso funciona muito bem apenas se houver apenas atualizações ou novos arquivos no futuro. Se houver exclusões, ele não fará nada.

No rsync, existem as opções --delete e --delete-after para ajudar a realizar o que eu quero, mas o fato é que não funciona em uma sincronização bidirecional.

Se eu quiser excluir arquivos do servidor em um syn, quando os arquivos locais foram excluídos, funciona, mas se, por algum motivo (explicado a seguir) eu tiver alguns arquivos que não estão no servidor, mas existem localmente e foram excluídos, Eu quero removê-los localmente e não copiados pelo servidor (como acontece).

O fato é que tenho 3 máquinas em contexto:

  1. Área de Trabalho
  2. caderno
  3. servidor doméstico

Então, às vezes, o servidor terá arquivos que foram excluídos com uma sincronização de notebook, por exemplo, e então, quando eu executar uma sincronização com meu desktop (onde os arquivos do servidor excluídos ainda existem), quero que esses arquivos sejam excluídos e não sejam copiado novamente para o servidor.

Acho que isso só é possível com um banco de dados e controle de operações: P

Alguma solução mais simples? Obrigado.


1
Eu tenho esse mesmo problema. Você encontrou uma solução, mwm?
mouche de

7
eu realmente fiz agora. Eu estava tentando obter uma experiência semelhante à caixa de depósito e surgiu com uma solução que envolve unison (que usa rsync) e lsyncd para monitorar alterações de arquivo. eu também encontrei outras pessoas com essa solução e mais truques no topo » cerebralmastication.com/2011/04/fast-two-way-sync-in-ubuntu
mwm

hoje em dia estou usando nextcloud localmente no meu servidor doméstico. solução perfeita "dropbox" 100% gerenciada por mim. tem clientes android / ios / win / macos / linux / web.
mwm

Respostas:


63

Experimente o Unison: http://www.cis.upenn.edu/~bcpierce/unison/

Sintaxe: unison dirA/ dirB/

O Unison pergunta o que fazer quando os arquivos são diferentes, mas você pode automatizar o processo usando o seguinte, que aceita opções padrão (não conflitantes):

unison -auto dirA/ dirB/

unison -batch dirA/ dirB/ não faz nenhuma pergunta e grava na saída quantos arquivos foram ignorados (porque houve conflito).


7
O Unison é muito fácil de usar para pequenos diretórios. Mas é terrivelmente LENTO para diretórios com um grande número de arquivos. Enquanto o rsync vai começar a copiar quase imediatamente, o unison às vezes leva mais de 12 horas para começar a copiar, porque ele verifica todos os arquivos antes de copiar qualquer coisa.
Brent Faust

1
É bom nisso? Pelo menos o git é fácil de usar e o transporte é rápido. Para o blob, há uma extensão desenvolvida pelo github chamada Large File Storage .
wener

1
Os principais problemas do git são arquivos grandes e ele é realmente projetado para commits explícitos. Ambos podem ser razoavelmente melhorados por complementos como git-attach, armazenamento de arquivos grandes, etc.
alex

3
@wener Não use um martelo como parafuso ou uma chave de fenda como prego. :)
ADTC de

2
o uníssono é ótimo - mas também muito pouco confiável. Em cerca de 50% dos meus casos de uso, a simplicidade não funcionou. A causa mais comum disso é a capacidade de inter versão insuficiente. Eu sincronizo às vezes com conteúdo em um computador para o qual não tenho privilégios. Se esse servidor tiver uma versão diferente da minha, o unison falhará. Além disso, recentemente tive uma falha entre clientes unison da mesma versão, porque eles estavam usando diferentes versões compiladas de alguma biblioteca (isso era entre um computador ubuntu e um raspberry pi).
argentum2f


5

Você pode usar o Osync: http://www.netpower.fr/osync , que é baseado em rsync com propagação de exclusão inteligente. ele também tem várias opções, como retomar uma execução interrompida, exclusão suave e controle de tempo.


5

Uma vez que a pergunta original também envolve um desktop e laptop e exemplos envolvendo arquivos de música (portanto, ele provavelmente está usando uma GUI), eu também mencionaria um dos melhores programas bidirecionais, multiplataformas, gratuitos e de código aberto até hoje: FreeFileSync .

É baseado em GUI, muito rápido e intuitivo, vem com filtragem e muitas outras opções, incluindo a capacidade de conexão remota, para visualizar e gerenciar interativamente "colisões" (por exemplo, arquivos com timestamps semelhantes) e para alternar entre transferência bidirecional, espelhamento e em breve.


4

Tente isto,

get-music:
 rsync -avzru --delete-excluded server:/media/10001/music/ /media/Incoming/music/

put-music:
 rsync -avzru --delete-excluded /media/Incoming/music/ server:/media/10001/music/

sync-music: get-music put-music

Acabei de testar isso e funcionou para mim. Estou fazendo uma sincronização bidirecional entre o Windows7 (usando cygwin com o pacote rsync instalado) e o servidor de arquivos FreeNAS (o FreeNAS é executado no FreeBSD com o pacote rsync pré-instalado).


3
Isso não excluirá novos arquivos locais? -uignora os arquivos mais recentes no destino, mas o rsync não tem uma maneira de rastrear a idade de uma exclusão, então como esse script poderia diferenciar entre quando um arquivo local é novo (e deve ser mantido) ou antigo (e deve ser excluído) ? Ou estou entendendo mal?
Mattemática

Exclui --delete-excludedalgum arquivo existente nos diretórios de destino, mas não nos diretórios de origem? Achei que você tivesse que definir, --exclude=<filename>então o rsync não vai deletar apenas essas exclusões? Ou o rsync trata todos os arquivos de diretório não-fonte como "exclui"?
Mr_Moneybags de

2
Encontrou a resposta: Além de excluir os arquivos do lado de recebimento que não estão no lado de envio, isso diz ao rsync para também excluir todos os arquivos do lado de recebimento que foram excluídos (consulte --exclude) rsync.samba.org/ftp /rsync/rsync.html
Mr_Moneybags de

2
Pelo que entendi, se eu criar um arquivo no destino e, em seguida, executar o comando rsync para copiar da origem para o destino, ele apagará o arquivo no destino, já que nenhum carimbo de data / hora é usado. Não é isso que você quer, certo?
elexhobby

10
@ Lübnah: Correto; esta solução não é uma sincronização bidirecional completa : Porque rsync com --delete-excludedé executado com o servidor como a fonte primeiro: os arquivos adicionados localmente serão excluídos durante a execução (enquanto os arquivos adicionados ao servidor são copiados para o destino local). Os únicos arquivos locais sincronizados de volta com o servidor são arquivos que também existem no servidor e foram modificados localmente (mais recentemente do que as versões do servidor) - o que não é provável no cenário do OP. Como você sugere, parece-me que a sincronização bidirecional verdadeira não pode ser feita com rsync, porque é necessário salvar o estado entre as execuções.
mklement0


1

Agora estou usando SparkleShare https://www.sparkleshare.org/

funciona em mac, linux e windows.


com o passar do tempo, continuo atualizando minha solução. Agora estou usando nextcloud no meu servidor doméstico. sincronizando com o cliente nextcloud no linux, mac, windows, android e ios.
mwm

0

Não tenho certeza se funciona com sincronização de dois, mas para o --delete funcionar, você também precisa adicionar o parâmetro --recursive.


1
O equivalente abreviado de opção --recurseé o -rque o OP está usando (incorporado no grupo de opções compactadas -avzru).
mklement0

0

Você pode usar o cloudsync para manter uma pasta sincronizada com um controle remoto:

pip install cloudsync
pip install cloudsync-gdrive
cloudsync sync file:c:/users/me/documents gdrive:/mydocs

Se o remoto for NFS, você pode usar:

cloudsync sync file:c:/users/me/documents/ file:/mnt/nfs/whatevs

-1

Rclone é o que você está procurando. Rclone ("rsync para armazenamento em nuvem") é um programa de linha de comando para sincronizar arquivos e diretórios de e para diferentes provedores de armazenamento em nuvem, incluindo sistemas de arquivos locais. Rclone era conhecido anteriormente como Swiftsync e está disponível desde 2013.


Não suporta sincronização bidirecional: rclone.org/commands/rclone_sync
Martin Braun
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.