Sincronizzazione bidirezionale con rsync


95

Ho una cartella a / e una cartella remota A /. Ora eseguo qualcosa di simile su un 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 creo musica di sincronizzazione, prima ottiene tutte le differenze dal server al locale e poi il contrario, inviando tutte le differenze dal locale al server.

Funziona molto bene solo se ci sono solo aggiornamenti o nuovi file in futuro. Se sono presenti eliminazioni, non viene eseguita alcuna operazione.

In rsync ci sono le opzioni --delete e --delete-after per aiutare a realizzare ciò che voglio, ma il fatto è che non funziona su una sincronizzazione a 2 vie.

Se voglio eliminare i file del server su una sincronizzazione, quando i file locali sono stati eliminati, funziona, ma se, per qualche motivo (spiegato dopo) ho alcuni file che non sono nel server ma esistono localmente e sono stati eliminati, Voglio rimuoverli localmente e non copiarli sul server (come accade).

Il fatto è che ho 3 macchine nel contesto:

  1. desktop
  2. taccuino
  3. home-server

Quindi, a volte, il server avrà file che sono stati eliminati con una sincronizzazione del notebook, ad esempio e quindi, quando eseguo una sincronizzazione con il mio desktop (dove i file del server eliminati esistono ancora) voglio che questi file vengano eliminati e non vengano copiato di nuovo sul server.

Immagino che questo sia possibile solo con un database e una traccia delle operazioni: P

Qualche soluzione più semplice? Grazie.


1
Ho lo stesso problema. Hai trovato una soluzione, mwm?
mouche

7
in realtà l'ho fatto ora. Stavo cercando di ottenere un'esperienza simile a una casella personale e ho escogitato una soluzione che coinvolge l'unisono (che utilizza rsync) e lsyncd per il monitoraggio delle modifiche ai file. ho anche trovato altre persone con questa soluzione e altri trucchi in cima » cerebralmastication.com/2011/04/fast-two-way-sync-in-ubuntu
mwm

al giorno d'oggi sto usando nextcloud localmente sul mio server di casa. soluzione "dropbox" perfetta gestita al 100% da me. ha client android / ios / win / macos / linux / web.
mwm

Risposte:


63

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

Sintassi: unison dirA/ dirB/

Unison chiede cosa fare quando i file sono diversi, ma puoi automatizzare il processo utilizzando quanto segue che accetta le opzioni predefinite (non in conflitto):

unison -auto dirA/ dirB/

unison -batch dirA/ dirB/ non fa alcuna domanda e scrive per visualizzare quanti file sono stati ignorati (perché erano in conflitto).


7
Unison è abbastanza facile da usare per piccole directory. Ma è tremendamente LENTO per directory con un gran numero di file. Laddove rsync inizierà a copiare quasi subito, l'unisono a volte impiega più di 12 ore per iniziare a copiare, perché scansiona ogni file prima di copiare qualsiasi cosa.
Brent Faust

1
Almeno git è facile da usare e il trasporto è veloce. Per blob c'è un'estensione sviluppata da github chiamata Large File Storage .
wener

1
I problemi principali di git sono file di grandi dimensioni e che è davvero progettato per commit espliciti. Entrambi possono essere ragionevolmente migliorati da componenti aggiuntivi come git-annex, archiviazione di file di grandi dimensioni, ecc.
alex

3
@wener Non usare un martello per una vite o un cacciavite per un chiodo. :)
ADTC

2
l'unisono è fantastico, ma anche molto inaffidabile. In circa il 50% dei miei casi d'uso semplicemente non ha funzionato. La causa più comune di ciò è la scarsa capacità tra le versioni. A volte mi sincronizzo con contenuti su un computer su cui non ho privilegi. Se quel server ha una versione diversa dalla mia, l'unisono fallisce. Inoltre, di recente ho avuto un errore tra client all'unisono della stessa versione, perché stavano usando diverse versioni compilate di alcune librerie (questo era tra un computer ubuntu e un raspberry pi).
argentum2f


5

Potresti usare Osync: http://www.netpower.fr/osync , che è basato su rsync con una propagazione intelligente della cancellazione. ha anche più opzioni come la ripresa di un'esecuzione interrotta, l'eliminazione graduale e il controllo del tempo.


5

Poiché la domanda originale riguarda anche un desktop e un laptop e un esempio che coinvolge file musicali (quindi probabilmente sta usando una GUI), menzionerei anche uno dei migliori programmi bidirezionali, multipiattaforma, gratuiti e open source fino ad oggi: FreeFileSync .

È basato su GUI, molto veloce e intuitivo, include filtri e molte altre opzioni, inclusa la possibilità di connettersi in remoto, visualizzare e gestire interattivamente le "collisioni" (ad esempio, file con timestamp simili) e passare da trasferimento bidirezionale, mirroring e presto.


4

Prova questo,

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

Ho appena provato questo e ha funzionato per me. Sto eseguendo una sincronizzazione a 2 vie tra Windows7 (usando cygwin con il pacchetto rsync installato) e il fileserver FreeNAS (FreeNAS gira su FreeBSD con il pacchetto rsync preinstallato).


3
Questo non eliminerà i nuovi file locali? -usalta i file più recenti nella destinazione, ma rsync non ha un modo per tenere traccia dell'età di un'eliminazione, quindi come potrebbe questo script distinguere tra quando un file locale è nuovo (e dovrebbe essere mantenuto) o vecchio (e dovrebbe essere eliminato) ? O sto fraintendendo?
Matthemattics

Non --delete-excludedeliminare tutti i file presenti nelle directory di destinazione ma non directory di origine? Pensavo che dovessi definire, --exclude=<filename>quindi rsync non eliminerà solo queste esclusioni? O rsync tratta tutti i file di directory non di origine come "esclude"?
Mr_Moneybags

2
Trovato la risposta: oltre a eliminare i file sul lato ricevente che non si trovano sul lato mittente, questo dice a rsync di eliminare anche tutti i file sul lato ricevente che sono esclusi (vedi --exclude) rsync.samba.org/ftp /rsync/rsync.html
Mr_Moneybags

2
Da quanto ho capito, se creo un file sulla destinazione e poi eseguo il comando rsync per copiare dalla sorgente alla destinazione, cancellerà il file nella destinazione, poiché non vengono utilizzati timestamp. Questo non è quello che vuoi, giusto?
elexhobby

10
@ Lübnah: corretto; questa soluzione non è una sincronizzazione bidirezionale completa : poiché rsync con --delete-excludedviene eseguito prima con il server come origine : i file aggiunti localmente verranno eliminati durante tale esecuzione (mentre i file aggiunti al server vengono copiati nella destinazione locale). Gli unici file locali sincronizzati di nuovo con il server sono file che esistono anche sul server e sono stati modificati localmente (più recentemente rispetto alle versioni del server), il che non è probabile nello scenario dell'OP. Come suggerisci, penso che non sia possibile eseguire una vera sincronizzazione a 2 vie rsync, perché è necessario salvare lo stato tra le esecuzioni.
mklement0


1

Ora sto usando SparkleShare https://www.sparkleshare.org/

funziona su Mac, Linux e Windows.


col passare del tempo, continuo ad aggiornare la mia soluzione. Ora sto usando Nextcloud sul mio server di casa. sincronizzazione con il client nextcloud su linux, mac, windows, android e ios.
mwm

0

Non sono sicuro che funzioni con due sincronizzazioni, ma affinché --delete funzioni è necessario aggiungere anche il parametro --recursive.


1
L'equivalente breve di opzione --recurseè -r, che l'OP sta usando (incorporato nel gruppo di opzioni compresse -avzru).
mklement0

0

Puoi utilizzare cloudsync per mantenere una cartella sincronizzata con un telecomando:

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

Se il telecomando è NFS, puoi usare:

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

-1

Rclone è quello che stai cercando. Rclone ("rsync for cloud storage") è un programma a riga di comando per sincronizzare file e directory da e verso diversi provider di cloud storage, inclusi i filesystem locali. Rclone era precedentemente noto come Swiftsync ed è disponibile dal 2013.


Non supporta la sincronizzazione bidirezionale: rclone.org/commands/rclone_sync
Martin Braun
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.