Sincronizzare files tra cartelle con rsync

Ti sei mai trovato nella situazione di dover copiare una marea di files da una cartella all’altra, che sia su un server locale o da un server ad un altro?
Sicuramente si. Ed immagino che davanti a questa esigenza la tua domanda sarà stata “Quale sarà il modo migliore e più veloce di farlo?”.
La risposta è il comando “rsync” ed in questo articolo scopriremo le sue potenzialità e come usarlo!
- Leggi l'articolo, ti bastano solo 7 minuti, 1 secondo
Sei di fretta? Scarica il PDF e consultalo quando vuoi!
Sommario
Cos’è rsync?
Rsync è un comando da terminale molto potente, che consente di sincronizzare files e cartelle tra due posizioni. Può essere usato sia in locale, per sincronizzare due cartelle sulla stessa macchina, sia in remoto, per sincronizzare due cartelle su server diversi.
Il suo punto principale di forza è la copia differenziale. Cosa vuol dire?
Rsync copia solo ciò che è stato modificato, risparmiando tantissimo tempo e banda.
Questo comportamento fa di rsync uno strumento potentissimo per creare backup incrementali o deploy di progetti, senza doverti preoccupare di nulla, solo le differenze tra sorgente e destinazione verranno sincronizzate.
Comodo no? Ti assicuro che l’uso di rsync ti semplificherà la vita lavorativa in tantissimi casi, facendoti risparmiare tempo, risorse, problemi e senza stress!
La sintassi base
Niente paura, rsync è più semplice di quanto sembri!
La sintassi è elementare e richiede pochi parametri:
rsync opzioni sorgente destinazione
Ecco un esempio minimo reale (al momento senza alcuna opzione) per usare rsync:
rsync /percorso_sorgente/ /percorso_destinazione/
Una volta lanciato il comando, rsync si preoccuperà di verificare le differenze tra i files nella cartella /percorso_sorgente/ ed i files nella cartella /percorso_destinazione/ e copierà solo quelli che effettivamente mancano o sono diversi.
Il vantaggio è notevole, basti pensare che se i files contenuti nelle due cartelle sono migliaia, per mantenerli in sincrono dovesti farne una copia completa ogni volta che ti occorre.
Con rsync, se è cambiato un solo file, copierai un solo file.
Copia remota
Ma come funziona rsync per copiare files su un server remoto?
Niente di più semplice, basta sfruttare SSH:
rsync /percorso_sorgente/ username@serveraddress:/percorso_destinazione/
Username è il nome utente dell’account SSH che ti consente di collegarti da remoto al server di destinazione, Serveraddress è l’indirizzo del server (che sia DNS o IP).
Una volta lanciato, i tuoi file saranno sul server remoto senza neanche che te ne accorga!
Alcuni casi d'uso
Vale la pena soffermarci un attimo a riflettere, prima di continuare, su un aspetto importante: le casistiche di utilizzo.
Ovvero, in quali casi ti potrebbe essere utile rsync?
La risposta è: tantissimi, ma te ne elencherò qualcuno in cui ritengo che rsync sia un alleato indispensabile.
BACKUP IMMAGINI
Solitamente le cartelle che contengono immagini sono enormi, sia dal punto di vista del numero di files e sottocartelle, sia dal punto di vista del “peso” in termini di MB.
Fare una copia di backup in questi casi è spesso massacrante sia in termini di tempo che di performance.
Ad esempio, pensa se una volta al giorno tu dovessi assicurarti di aver fatto una copia di tutte le nuove immagini di un tuo sito o di una tua cartella personale. Ogni giorno, dovresti o fare una copia completa, che richiederebbe molto tempo e molto traffico di bytes, oppure selezionare manualmente le immagini nuove o modificate e copiare solo quelle.
Questa seconda scelta può sembrare più rapida, ovviamente, ma pensa se le immagini fossero dislocate in sottocartelle (es: giorno-mese-anno di creazione). Dovresti verificare per ogni cartella che ci siano immagini modificate da sincronizzare!
Rsync ti evita tutto questo. Sarà lui a verificare tutto questo per te ed in modo ultra rapido, copiando solo ciò che occorre.
DEPLOY DI UN PROGETTO
Immagina di avere un sito web. con una copia in locale di sviluppo o una copia di staging, che usi per “provare” le modifiche prima di metterlo in produzione (se non sai di cosa sto parlando, ti suggerisco di approfondire l’argomento, mi ringrazierai!!).
Ad ogni modifica, anche minima, dovresti annotarti quale file hai modificato, per poterne poi fare l’upload sul server di produzione. Molto noioso, oltre che estremamente pericoloso. Basta una distrazione e potresti non annotare un file modificato, non farne l’upload e… BOOM!
Certo, per sicurezza potresti ogni volta fare l’upload dell’intero progetto, ma quanto tempo ti occorrerebbe?
E allora, perché non usare rsync?
In questo modo, sarà lui a verificare i files e a copiare solo quelli che risultano modificati!
I vantaggi di rsync rispetto ad altre soluzioni
Rispetto alle opzioni di copia più comuni, come i comandi “cp” o “scp”, rsync ha numerosissimi vantaggi:
- Efficienza: la copia dei file da e verso sistemi remoti è ottimizzata
- Robustezza: supporta la copia dei permessi, timestamp e symbolic links
- Velocità: è più veloce di scp (Secure Copy) perché copia soltanto i file che sono cambiati, in accordo con il server che invia/riceve
- Performance: consente di risparmiare banda perché utilizza un sistema di compressione dati
Le opzioni che ti semplificano la vita
Finora ci siamo soffermati su un utilizzo base di rsync, ma sappi (come avrai notato nella sintassi base iniziale) che il comando mette a disposizione numerose opzioni, che lo rendono ancora più versatile e potente. Scopriamole insieme!
-z: abilita la compressione dei dati in transito (utile soprattutto per le connessioni remote)
-v: abilita la verbose mode, ovvero ti fa vedere cosa sta succedendo passo passo (utile!)
-a: abilita la modalità “archivio”, ovvero mantiene tutte le condizioni originali del file dalla sorgente alla destinazione come timestamp, link simbolici, permessi, proprietario e gruppo
-h: trasforma i byte in un formato più leggibile (es. Mb, Gb)
-u: indica di non sovrascrivere i file nella destinazione se sono più recenti di quelli nella sorgente
--delete: elimina i file dalla destinazione se non esistono più nella sorgente (attenzione: può essere pericoloso!)
--progress: mostra l’avanzamento del processo (utile con file grandi)
--exclude: esclude file o cartelle da ignorare (es: .git)
Vediamo quindi ora un esempio reale completo di opzioni:
rsync -avzhu --exclude=.DS_Store --delete --progress ~/Immagini/ johndoe@192.168.1.100:/backup/
Nell’esempio, sincronizziamo il contenuto della cartella locale “Immagini” nella cartella “backup” di un server remoto con indirizzo IP 192.168.1.100 (puramente inventato, oltretutto è un indirizzo di rete locale).
Abbiamo chiesto a rsync di:
- mantenere le condizioni originali (timestamp, permessi ecc)
- mostrare a video cosa succede
- comprimere i dati in trasmissione
- mostrare i size in modo “human readable”
- di non sovrascrivere i files se nella destinazione risultano più recenti
In più, abbiamo chiesto a rsync di:
- escludere i files “.DS_Store” (sono file di sistema dei sistemi MacOsX)
- eliminare nella cartella di destinazione “backup” sul server remoto eventuali files che non sono più presenti
- mostrare lo stato di avanzamento del processo
sulla cartella di origine “Immagini” locale
Altri trucchetti utili
Non finisce ancora qui! Rsync ha ulteriori opzioni che reputo molto utili e che devi conoscere:
--log-file=nomefile.log: consente di scrivere un log delle operazioni eseguite
--dry-run: per avere un’anteprima simulata di cosa succederà una volta eseguito
--remove-source-files: consente di eliminare il file sorgente una volta trasferito alla destinazione
--bwlimit=KBPS: imposta un limite di banda per la sincronizzazione, dove KBPS è il valore in kilobyte per secondo (es: –bwlimit=100, limita il trasferimento a 100Kb/s)
Conclusioni
Rsync è uno di quei comandi che, una volta imparato, non lasci più. È veloce, intelligente e super flessibile. Che tu stia facendo backup, sincronizzando progetti o distribuendo file su server remoti, rsync è il tuo alleato fidato.
Hai già usato rsync in un tuo progetto? Ti ha salvato la giornata? Scrivilo nei commenti!