Oggi vi presento uno strumento utilissimo per sincronizzare file e cartelle, anche fra macchine diverse. Si può dire che sia uno strumento imprescindibile: chi è un po’ più esperto avrà già riconosciuto nella descrizione rsync.
La sincronizzazione locale
Come prima cosa vediamo la sincronizzazione fra due cartelle sulla stessa macchina. Creiamo, in una cartella vuota, due sottocartelle:
mkdir sorgente destinazione
Dentro sorgente creiamo qualche file e qualche sottocartella, con dei file anche dentro le cartelle, giusto un piccolo albero di prova:
cd sorgente
touch test1.txt
mkdir dir1 dir2 dir3
touch dir1/a.txt dir2/b.txt dir3/c.txt
La destinazione è vuota. Usiamo rsync nella sua forma più comune:
rsync -avh . ../destinazione
Le opzioni sono tre, le più usate in assoluto:
- -a è un’opzione cumulativa, equivale a -rlptgoD: copia ricorsivamente un albero di cartelle mantenendo inalterati proprietà, permessi, date e link simbolici (per i dettagli, un po’ avanzati, vedete man rsync);
- -v sta per verbose, ci dà informazioni sulle cose trasferite;
- -h sta per human readable, mostra le dimensioni in formato leggibile e non in byte.
Poi diciamo la sorgente della copia (qui il punto, la cartella in cui siamo) e la destinazione. Rsync elenca tutto quello che ha copiato:
sending incremental file list
./
test1.txt
dir1/
dir1/a.txt
dir2/
dir2/b.txt
dir3/
dir3/c.txt
Un ls della destinazione conferma che c’è tutto. La cosa interessante viene ora: se aggiungo un solo file in sorgente e rifaccio la sincronizzazione, solo il nuovo file viene copiato:
touch test2.txt
rsync -avh . ../destinazione
L’output è:
sending incremental file list
test2.txt
Specialmente nelle copie remote questo fa risparmiare un sacco di tempo e di banda, ma anche in locale è inutile copiare file già aggiornati dall’altra parte. Per questo rsync è uno dei modi più veloci di tenere sincronizzate le cartelle.
Le cancellazioni: –delete
Cosa succede se elimino un file in sorgente? Se faccio:
rm -f test2.txt
rsync -avh . ../destinazione
non succede nulla, e in destinazione test2.txt è ancora presente. Se voglio che la destinazione resti esattamente allineata alla sorgente, comprese le cancellazioni, devo usare –delete:
rsync -avh --delete . ../destinazione
L’output è:
sending incremental file list
deleting test2.txt
Il file viene rimosso dalla destinazione perché non è più presente in sorgente. Immaginate rsync come uno strumento per il mirror di cartelle: lo si usa per i backup, per i deploy di applicazioni o di siti web, e ha tantissimi altri impieghi grazie al suo comportamento intelligente.
La sincronizzazione remota
Ora un esempio remoto. Mi sposto su un’altra macchina, in una cartella che ho chiamato esempio, e faccio un rsync dalla macchina dei test precedenti. Di nuovo -avh e –delete, anche se qui è superfluo. La sorgente è la macchina remota, quindi dobbiamo dire a rsync come connettersi: utente e indirizzo, poi due punti e il percorso della sorgente:
rsync -avh --delete utente@indirizzo:/var/esempio/sorgente/ ./
Tutti i file presenti nella cartella remota vengono copiati nella cartella esempio. Anche qui posso fare modifiche, per esempio creando un nuovo file:
touch mondo.txt
Poi posso fare la sincronizzazione al contrario, cioè mettere come destinazione la cartella sulla macchina remota:
rsync -avh ./ utente@indirizzo:/var/esempio/sorgente/
Se ora vado sulla macchina remota e faccio un ls della sorgente trovo il file mondo.txt.
Escludere file e cartelle: –exclude
Cosa succede se voglio escludere dalla sincronizzazione una certa cartella, un file, o più cartelle e più file? Si usa –exclude. Supponiamo di avere in sorgente una cartella dir3 con dentro un file. Sincronizziamo escludendola, indicando il percorso a partire dalla cartella che stiamo sincronizzando:
rsync -avh --delete --exclude=dir3/ ./ ../destinazione
Il file mondo.txt, e le cartelle dir1 e dir2 sono sincronizzati, ma dir3 è stata esclusa. L’opzione si può ripetere più volte per escludere più elementi.
Conclusione
Con queste opzioni siete già in grado di usare rsync per la maggior parte dei suoi scopi: backup, sincronizzazione, mirroring fra cartelle, deploy. In sintesi: rsync -avh copia solo ciò che è cambiato, –delete allinea anche le cancellazioni, –exclude lascia fuori ciò che non serve, e la forma utente@host:percorso lo porta sulla rete. Rsync è un programma complesso e ricco di opzioni, quindi vi consiglio di studiarvi la man page, oppure di chiedermi un video di approfondimento nei commenti. Poi aprite la vostra Linux box e giocateci.
Link e risorse
- il video su YouTube
- esempi e comandi della puntata su GitHub
- rsync(1), pagina di manuale — il manuale completo
- rsync(1) in italiano — in italiano
- Sito di rsync — il progetto
- Rsync su Wikipedia — in italiano
Sostieni il canale
questi link sono affiliati Amazon, acquistando i libri che ti consiglio sostieni il canale!
