Come mantenere sincronizzate automaticamente due cartelle?


92

Vorrei avere una copia sincronizzata di una cartella con tutta la sua sottostruttura.

Dovrebbe funzionare automaticamente in questo modo: ogni volta che creo, modifico o elimino cose dalla cartella originale, tali modifiche dovrebbero essere applicate automaticamente alla cartella di sincronizzazione.

Qual è l'approccio migliore a questo compito?

BTW: sono su Ubuntu 12.04

L'obiettivo finale è avere una copia di backup separata in tempo reale, senza l'uso di collegamenti simbolici o mount. Ho usato Ubuntu One per sincronizzare i dati tra i miei computer, e dopo un po 'qualcosa è andato storto e tutti i miei dati sono andati persi durante una sincronizzazione.

Quindi ho pensato di aggiungere un ulteriore passo avanti per mantenere una copia di backup dei miei dati:

  • Conservo i miei dati in una "cartella A"
  • Ho bisogno della risposta alla mia domanda corrente per creare una sincronizzazione unidirezionale della "cartella A" con la "cartella B" ( cronuno script con rsync? Potrebbe essere?). Ho bisogno che sia solo unidirezionale da A a B, eventuali modifiche a B non devono essere applicate ad A.
  • Semplicemente tengo sincronizzata la "cartella B" con Ubuntu One.

    In questo modo qualsiasi cambiamento in A verrà applicato a B, che verrà rilevato da U1 e sincronizzato con il cloud. Se qualcosa va storto e U1 cancella i miei dati su B, li ho sempre su A.

Ispirato dai commenti di lanzz, un'altra idea potrebbe essere quella di eseguire rsync all'avvio per eseguire il backup del contenuto di una cartella in Ubuntu One e avviare Ubuntu One solo dopo che rsync è stato completato.

Cosa ne pensi di questo? Come sapere quando termina rsync?


Cosa stai cercando di ottenere? Le cartelle devono davvero essere separate, non puoi collegare simbolicamente un nome all'altro o eseguire il bind-mount della directory nella posizione secondaria? Inoltre, dai un'occhiata a questi risultati di ricerca .
lanzz

1
Vorrei consigliare contro effettiva sincronizzazione dal vivo (cioè guardare continuamente per modifiche apportate ai file nella directory di origine), a periodica rsynctramite cron.
lanzz

Risposte:


103

Puoi usare inotifywait(con i modify,create,delete,moveflag abilitati) e rsync.

while inotifywait -r -e modify,create,delete,move /directory; do
    rsync -avz /directory /target
done

Se non hai inotifywaitsul tuo sistema, eseguisudo apt-get install inotify-tools


3
Potresti prendere in considerazione l'aggiunta -e ssh user@remote:/targeta rsyncse desideri utilizzare SSH come trasporto per accedere alla tua macchina remota.
Falcon

2
Grazie @Falcon, di solito uso rsync -avz --delete --exclude-from=.rsyncignore /directory user@server:path. Tuttavia ho voluto scrivere una semplice risposta.
silgon

5
per chiarire: è una cosa da fare una tantum o aggiungeresti questo a un bashrc o qualcosa del genere?
Brad Johnson

1
Puoi considerare l'intero ciclo while come un processo che si sincronizza quando necessario. Di solito lo aggiungo al Makefile del progetto su cui sto lavorando. In questo modo posso scegliere il server e la directory in cui voglio che venga salvato. Uno dei miei casi d'uso è quando programma algoritmi di deep learning nel mio laptop e lo sincronizzo per eseguire il processo pesante in un computer dedicato con CPU e GPU migliori. Escludo anche i file che non mi servono, come la .gitcartella.
Silgon

2
Questo non gestisce le modify,create,delete,move
ridenominazioni dei

25

Hai bisogno di qualcosa del genere: https://github.com/axkibe/lsyncd È uno strumento che combina rsync e inotify - il primo è uno strumento che rispecchia, con le opzioni corrette impostate, una directory fino all'ultimo bit. Quest'ultimo dice al kernel di notificare a un programma le modifiche a una directory o file. Dice:

Aggrega e combina eventi per alcuni secondi, quindi genera uno (o più) processi per sincronizzare le modifiche.

Ma - secondo Digital Ocean su https://www.digitalocean.com/community/tutorials/how-to-mirror-local-and-remote-directories-on-a-vps-with-lsyncd - dovrebbe essere in il repository di Ubuntu!

Ho requisiti simili e questo strumento, che devo ancora provare, sembra adatto all'attività.


1
lsyncd all'inizio sembrava un proiettile d'argento, ma ha molti problemi aperti e apparentemente l'implementazione di macOS è "vecchia e obsoleta". Non sono riuscito a farlo funzionare il 10.12.
un nerd pagato il

@apaidnerd Per essere onesti, sono 90 numeri aperti contro 420 chiusi. Tuttavia, solo 10/40 numeri sono stati chiusi nell'ultimo anno.
Mateen Ulhaq

8

Solo una semplice modifica della risposta @silgon:

while true; do 
  inotifywait -r -e modify,create,delete /directory
  rsync -avz /directory /target
done

(La versione @silgon a volte si arresta in modo anomalo su Ubuntu 16 se la esegui in cron)


2
Perché dovresti eseguirlo in cron?
saygley

@saygley Per un'attività specifica, dopo il riavvio di Ubuntu il processo di sincronizzazione dovrebbe essere eseguito automaticamente
Denis Kuzin

5
Capisco .. Tuttavia, poiché questo normalmente dovrebbe essere avviato una volta ed essere in esecuzione finché il server è attivo; Considererei invece qualcosa di inlined all'interno di rc.local.
saygley

2

Puoi sfruttare fschange . È una notifica di modifica del file system Linux. Il codice sorgente è scaricabile dal link sopra, puoi compilarlo da solo. fschangepuò essere utilizzato per tenere traccia delle modifiche ai file leggendo i dati da un file proc (/ proc / fschange). Quando i dati vengono scritti in un file, fschange riporta l'intervallo esatto che è stato modificato invece di limitarsi a dire che il file è stato modificato. Se stai cercando la soluzione più avanzata, ti suggerisco di controllare Resilio Connect . È multipiattaforma, fornisce opzioni estese per l'uso e il monitoraggio. Poiché è basato su BitTorrent, è più veloce di qualsiasi altro strumento di sincronizzazione esistente. È stato scritto per loro conto.


0

Uso questo programma gratuito per sincronizzare file e directory locali: https://github.com/Fitus/Zaloha.sh . Il repository contiene anche una semplice demo.

Il punto positivo: è uno script di shell bash (un solo file). Non una scatola nera come altri programmi. C'è anche la documentazione. Inoltre, con alcuni talenti tecnici, puoi "piegarlo" e "integrarlo" per creare la soluzione finale che ti piace.

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.