Come usare Rsync per sincronizzare directory locali e remote

Introduzione

Rsync, che sta per “remote sync”, è uno strumento di sincronizzazione di file remoti e locali. Utilizza un algoritmo che minimizza la quantità di dati copiati spostando solo le porzioni di file che sono cambiate.

In questa guida, copriremo l’uso di base di questa potente utility.

Che cos’è Rsync?

Rsync è uno strumento di sincronizzazione in rete molto flessibile. A causa della sua ubiquità su Linux e sui sistemi Unix-like e della sua popolarità come strumento per gli script di sistema, è incluso di default nella maggior parte delle distribuzioni Linux.

Sintassi di base

La sintassi di base di rsync è molto semplice, e funziona in un modo simile a ssh, scp e cp.

Creiamo due directory di prova e alcuni file di prova con i seguenti comandi:

  • cd ~
  • mkdir dir1
  • mkdir dir2
  • touch dir1/file{1..100}

Ora abbiamo una directory chiamata dir1 con 100 file vuoti.

  • ls dir1
Output
file1 file18 file27 file36 file45 file54 file63 file72 file81 file90file10 file19 file28 file37 file46 file55 file64 file73 file82 file91file100 file2 file29 file38 file47 file56 file65 file74 file83 file92file11 file20 file3 file39 file48 file57 file66 file75 file84 file93file12 file21 file30 file4 file49 file58 file67 file76 file85 file94file13 file22 file31 file40 file5 file59 file68 file77 file86 file95file14 file23 file32 file41 file50 file6 file69 file78 file87 file96file15 file24 file33 file42 file51 file60 file7 file79 file88 file97file16 file25 file34 file43 file52 file61 file70 file8 file89 file98file17 file26 file35 file44 file53 file62 file71 file80 file9 file99

Abbiamo anche una directory vuota chiamata dir2.

Per sincronizzare il contenuto di dir1 con dir2 sullo stesso sistema, digitate:

  • rsync -r dir1/ dir2

L’opzione -r significa ricorsivo, che è necessario per la sincronizzazione delle directory.

Potremmo anche usare il flag -a invece:

  • rsync -a dir1/ dir2

L’opzione -a è un flag combinato. Sta per “archivio” e sincronizza ricorsivamente e conserva i collegamenti simbolici, i file speciali e di dispositivo, i tempi di modifica, il gruppo, il proprietario e i permessi. È più comunemente usato di -r e di solito è quello che vuoi usare.

Una nota importante

Potresti aver notato che c’è una barra finale (/) alla fine del primo argomento nei comandi precedenti:

  • rsync -a dir1/ dir2

Questo è necessario per significare “il contenuto di dir1“. L’alternativa, senza la barra finale, metterebbe dir1, inclusa la directory, dentro dir2. Questo creerebbe una gerarchia che assomiglia a:

  • ~/dir2/dir1/

Controlla sempre due volte i tuoi argomenti prima di eseguire un comando rsync. Rsync fornisce un metodo per farlo passando le opzioni -n o --dry-run. Il flag -v (per verbose) è anche necessario per ottenere l’output appropriato:

  • rsync -anv dir1/ dir2
Output
sending incremental file list./file1file10file100file11file12file13file14file15file16file17file18. . .

Confronta questo output con quello che otteniamo quando rimuoviamo la barra finale:

  • rsync -anv dir1 dir2
Output
sending incremental file listdir1/dir1/file1dir1/file10dir1/file100dir1/file11dir1/file12dir1/file13dir1/file14dir1/file15dir1/file16dir1/file17dir1/file18. . .

Puoi vedere qui che la directory stessa viene trasferita.

Come usare Rsync per sincronizzarsi con un sistema remoto

Sincronizzare su un sistema remoto è banale se si ha accesso SSH alla macchina remota e rsync installato su entrambi i lati. Una volta verificato l’accesso SSH tra le due macchine, puoi sincronizzare la cartella dir1 da prima a un computer remoto usando questa sintassi (nota che vogliamo trasferire la directory effettiva in questo caso, quindi omettiamo la barra finale):

  • rsync -a ~/dir1 username@remote_host:destination_directory

Questa è chiamata un’operazione “push” perché spinge una directory dal sistema locale a un sistema remoto. L’operazione opposta è “pull”. È usata per sincronizzare una directory remota al sistema locale. Se la dir1 fosse sul sistema remoto invece che sul nostro sistema locale, la sintassi sarebbe:

  • rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine

Come cp e strumenti simili, la sorgente è sempre il primo argomento e la destinazione è sempre il secondo.

Opzioni utili per Rsync

Rsync fornisce molte opzioni per modificare il comportamento predefinito dell’utilità. Abbiamo già discusso alcuni dei flag più necessari.

Se stai trasferendo file che non sono già stati compressi, come i file di testo, puoi ridurre il trasferimento in rete aggiungendo la compressione con l’opzione -z:

  • rsync -az source destination

Il flag -P è molto utile. Combina le bandiere --progress e --partial. Il primo di questi ti dà una barra di progresso per i trasferimenti e il secondo ti permette di riprendere i trasferimenti interrotti:

  • rsync -azP source destination
Output
sending incremental file list./file1 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101)file10 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101)file100 0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=97/101)file11 0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=96/101). . .

Se eseguiamo nuovamente il comando, otterremo un output più breve, perché non sono state fatte modifiche. Questo illustra la capacità di rsync di usare i tempi di modifica per determinare se sono stati fatti dei cambiamenti.

  • rsync -azP source destination
Output
sending incremental file listsent 818 bytes received 12 bytes 1660.00 bytes/sectotal size is 0 speedup is 0.00

Possiamo aggiornare il tempo di modifica su alcuni dei file e vedere che rsync ricopia intelligentemente solo i file cambiati:

  • touch dir1/file{1..10}
  • rsync -azP source destination
Output
sending incremental file listfile1 0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=99/101)file10 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=98/101)file2 0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=87/101)file3 0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=76/101). . .

Per mantenere due directory veramente sincronizzate, è necessario cancellare i file dalla directory di destinazione se vengono rimossi dalla sorgente. Per default, rsync non cancella nulla dalla directory di destinazione.

Possiamo cambiare questo comportamento con l’opzione --delete. Prima di usare questa opzione, usate l’opzione --dry-run e fate dei test per prevenire la perdita di dati:

  • rsync -a --delete source destination

Se volete escludere certi file o directory che si trovano all’interno di una directory che state sincronizzando, potete farlo specificandoli in un elenco separato da virgole dopo l’opzione --exclude=:

  • rsync -a --exclude=pattern_to_exclude source destination

Se abbiamo specificato un modello da escludere, possiamo sovrascrivere tale esclusione per i file che corrispondono a un modello diverso usando l’opzione --include=.

  • rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination

Infine, l’opzione --backup di rsync può essere usata per conservare i backup di file importanti. Viene usata insieme all’opzione --backup-dir, che specifica la directory in cui i file di backup dovrebbero essere memorizzati.

  • rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination

Conclusione

Rsync può semplificare i trasferimenti di file su connessioni di rete e aggiungere robustezza alla sincronizzazione di directory locali. La flessibilità di rsync lo rende una buona opzione per molte operazioni diverse a livello di file.

La padronanza di rsync permette di progettare complesse operazioni di backup e di ottenere un controllo a grana fine su ciò che viene trasferito e come.

Si tratta di un’operazione di backup, ma non di un trasferimento di file.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.