rsync è un versatile strumento che sem­pli­fi­ca il tra­sfe­ri­men­to dei file in rete e accelera la sin­cro­niz­za­zio­ne delle cartelle locali. Grazie all’elevata fles­si­bi­li­tà, è un’ec­cel­len­te opzione per eseguire svariate ope­ra­zio­ni a livello di file.

Cos’è rsync?

rsync, ab­bre­via­zio­ne di “remote syn­chro­ni­za­tion”, è un fles­si­bi­le strumento di sin­cro­niz­za­zio­ne col­le­ga­bi­le in rete su Linux. Il programma open source permette di sin­cro­niz­za­re file e cartelle in sistemi locali o in rete. A questo scopo utilizza una tec­no­lo­gia di tra­smis­sio­ne dati dif­fe­ren­zia­le che tra­sfe­ri­sce solo le sezioni di dati ef­fet­ti­va­men­te mo­di­fi­ca­te. Così si riduce al minimo lo scambio di dati, ac­ce­le­ran­do no­te­vol­men­te il processo di sin­cro­niz­za­zio­ne. Grazie a una serie di opzioni, rsync permette di con­trol­la­re con pre­ci­sio­ne il com­por­ta­men­to di sin­cro­niz­za­zio­ne. La sintassi fles­si­bi­le consente inoltre sia di creare semplici copie locali sia di eseguire complesse sin­cro­niz­za­zio­ni in rete.

La sintassi di rsync

La sintassi di comando di rsync, strut­tu­ra­ta in modo semplice, as­so­mi­glia a quella di SSH, SCP e CP. La struttura di base si presenta come segue:

rsync [OPTION] source destination
bash

In source viene inserito il percorso di origine da cui sin­cro­niz­za­re i dati, mentre in destination si indica il percorso di de­sti­na­zio­ne. A questo scopo rsync offre numerose opzioni per adattare il processo di sin­cro­niz­za­zio­ne alle proprie esigenze. Tra le opzioni usate più di frequente troviamo:

  • -a (archive): contiene in modo ricorsivo au­to­riz­za­zio­ni di file, in­di­ca­to­ri di data e ora, gruppi, utenti e proprietà par­ti­co­la­ri dei file.
  • -v (verbose): mostra in­for­ma­zio­ni det­ta­glia­te sul processo di sin­cro­niz­za­zio­ne.
  • -r (recursive): sin­cro­niz­za le cartelle e i relativi contenuti in modo ricorsivo.
  • -u (update): trasmette solo i file ag­gior­na­ti rispetto a quelli già presenti nella cartella di de­sti­na­zio­ne.
  • -z (compress): riduce il traffico di dati in rete.
  • -n –itemize-changes: mostra una lista delle modifiche da apportare.
  • --delete: elimina dalla cartella di de­sti­na­zio­ne i file che non esistono più nella cartella di origine.
  • --exclude: esclude de­ter­mi­na­ti file o cartelle dalla sin­cro­niz­za­zio­ne.
  • --dry-run: simula il processo di sin­cro­niz­za­zio­ne senza tra­smet­te­re realmente i file.
  • --progress: indica l’avan­za­men­to del processo di tra­smis­sio­ne dei file.
  • --partial: i file trasmessi par­zial­men­te restano nella cartella di de­sti­na­zio­ne se la tra­smis­sio­ne viene in­ter­rot­ta. Quando viene eseguita una nuova tra­smis­sio­ne, il processo riprende dall’ultimo stato.

Esempio di sintassi di rsync

Per spiegare la sintassi di rsync ri­cor­ria­mo a un esempio pratico. Con il comando seguente vengono create la cartella dir1 con 100 file di prova vuoti e una seconda cartella dir2 vuota:

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

Il contenuto di dir1 può essere sin­cro­niz­za­to nello stesso sistema con dir2 usando l’opzione -r:

$ rsync -r dir1/ dir2
bash

In al­ter­na­ti­va, si può usare l’opzione -a, che esegue la sin­cro­niz­za­zio­ne in modo ricorsivo e contiene link simbolici, file di di­spo­si­ti­vi speciali, data e ora di modifica, gruppi, pro­prie­ta­ri e au­to­riz­za­zio­ni:

$ rsync -a dir1/ dir2
bash

N.B.: la barra ro­ve­scia­ta (/) alla fine della cartella di origine in un comando rsync è im­por­tan­te perché indica che è il contenuto della cartella a dover essere sin­cro­niz­za­to, non la cartella stessa.

$ rsync -a dir1/ dir2
Output
sending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
…
bash

Senza la barra ro­ve­scia­ta dopo la cartella di origine, il contenuto di questa cartella viene copiato nella cartella di de­sti­na­zio­ne:

$ rsync -a dir1/ dir2
Output
sending incremental file list
dir1/
dir1/file1
dir1/file10
dir1/file100
dir1/file11
dir1/file12
dir1/file13
dir1/file14
dir1/file15
dir1/file16
dir1/file17
dir1/file18
…
bash

Nella pratica è quindi utile inserire la barra ro­ve­scia­ta alla fine della cartella di de­sti­na­zio­ne per as­si­cu­rar­si che il processo di sin­cro­niz­za­zio­ne si svolga nel modo previsto e che il contenuto della cartella di origine con­flui­sca cor­ret­ta­men­te nella cartella di de­sti­na­zio­ne.

rsync: sin­cro­niz­za­zio­ne con un sistema remoto

In generale, sin­cro­niz­za­re un sistema remoto con rsync non è difficile. Basta disporre dell’accesso SSH al computer remoto e conoscere i dati di au­ten­ti­ca­zio­ne necessari. rsync utilizza spesso SSH (Secure Shell) per la co­mu­ni­ca­zio­ne sicura con i sistemi remoti. Lo strumento deve essere in­stal­la­to su entrambi i lati.

Una volta ve­ri­fi­ca­to l’accesso SSH tra i due computer è possibile sin­cro­niz­za­re la cartella dir1 su un computer remoto. In questo caso deve essere trasmessa la cartella vera e propria, pertanto nel comando seguente non è presente la barra ro­ve­scia­ta alla fine della cartella:

$ rsync -a ~/dir1 username@remote_host:destination_directory
bash

Quando una cartella viene spostata da un sistema locale a un sistema remoto si parla di ope­ra­zio­ne “push”. Al contrario, l’ope­ra­zio­ne “pull” sin­cro­niz­za una cartella remota con un sistema locale. La sintassi si presenta come segue:

$ rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine
bash
Server virtuali (VPS)
Affidati ai VPS e server di IONOS, il tuo partner digitale cer­ti­fi­ca­to ISO
  • 1 Gbps di larghezza di banda e traffico il­li­mi­ta­to
  • Di­spo­ni­bi­li­tà del 99,99% e cer­ti­fi­ca­zio­ne ISO
  • As­si­sten­za 24/7 e con­su­len­te personale

Utilizzo di altre opzioni in rsync

Le opzioni pre­sen­ta­te sopra con­sen­to­no di per­so­na­liz­za­re il com­por­ta­men­to di rsync.

Tra­smis­sio­ne di file non compressi con rsync

Il carico sulla rete durante la tra­smis­sio­ne di file non compressi può essere ridotto con l’opzione -z pro­ce­den­do come indicato di seguito:

$ rsync -az source destination
bash

Vi­sua­liz­za­re l’avan­za­men­to e ri­pren­de­re le tra­smis­sio­ni in­ter­rot­te

Con -P puoi combinare fra loro le opzioni --progress e --partial. Vi­sua­liz­zi così una pa­no­ra­mi­ca dell’avan­za­men­to della tra­smis­sio­ne e allo stesso tempo puoi ri­pren­de­re le ope­ra­zio­ni in­ter­rot­te:

$ 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)
…
bash

Esegui nuo­va­men­te il comando per generare un output più breve. Grazie a data e ora delle modifiche, con rsync è possibile de­ter­mi­na­re se sono state apportate modifiche.

$ rsync -azP source destination
Output
sending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00
bash

Mantenere le cartelle sin­cro­niz­za­te con rsync

Per as­si­cu­rar­si che due cartelle restino realmente sin­cro­niz­za­te è ne­ces­sa­rio eliminare dalla cartella di de­sti­na­zio­ne i file che sono stati rimossi dall’origine. Tuttavia, per im­po­sta­zio­ne pre­de­fi­ni­ta rsync non elimina i file dalla cartella di de­sti­na­zio­ne. Questo com­por­ta­men­to può essere mo­di­fi­ca­to con l’opzione --delete. Questa opzione è da usare in ogni caso con cautela, perché elimina dalla cartella di de­sti­na­zio­ne i file che non sono più presenti nell’origine.

Prima di ri­cor­rer­vi, si dovrebbe usare l’opzione --dry-run, che permette di eseguire una si­mu­la­zio­ne del processo di sin­cro­niz­za­zio­ne senza eliminare i file effettivi. Puoi così as­si­cu­rar­ti che vengano apportate solo le modifiche de­si­de­ra­te, senza perdere ac­ci­den­tal­men­te dati im­por­tan­ti:

$ rsync -a --delete source destination
bash

Escludere file e cartelle dalla sin­cro­niz­za­zio­ne con rsync

In rsync con l’opzione --exclude è possibile escludere de­ter­mi­na­ti file e cartelle dalla sin­cro­niz­za­zio­ne. È utile quando non si devono sin­cro­niz­za­re ad esempio file tem­po­ra­nei, file di registro o altri contenuti.

$ rsync -a --exclude=pattern_to_exclude source destination
bash

Una volta indicato un modello per escludere file è possibile so­vra­scri­ve­re l’esclu­sio­ne per i file cor­ri­spon­den­ti a un altro modello con l’opzione --include=.

$ rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination
bash

Salvare i backup con rsync

L’opzione --backup offre la pos­si­bi­li­tà di salvare backup dei dati im­por­tan­ti. È usata insieme all’opzione --backup-dir, che indica la cartella in cui devono essere salvati i file di backup:

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

Per un quadro più preciso dei diversi scenari di backup, consulta il nostro articolo su come creare un backup del server con rsync.

Vai al menu prin­ci­pa­le