Spesso nelle operazioni sistemistiche ci si trova nella condizione di dover sincronizzare una cartella con un'altra, in modo da aggiornare il contenuto della cartella di destinazione. Ad esempio quando si sviluppa su web solitamente le modifiche avvengono prima in locale, per poi essere pubblicate nel server remoto. Il comando rsync permette di effettuare queste operazioni in tempi rapidissimi e con una sintassi molto chiara e concisa. Per chi fa uso massivo del terminale ogni giorno questo comando può veramente salvare una montagna di tempo.

Che cos'è rsync

Si tratta di uno strumento di copia veloce e versatile che permette di copiare da una cartella sorgente remota o locale a una cartella destinazione remota o locale. Offre un numero di opzioni molto ampie, che lo rendono uno strumento molto flessibile per ogni caso d'uso. È un comando molto usato per effettuare backupmirroring e qulsiasi operazione di copia da eseguire ogni giorno.

Sincronizzare una cartella locale con una cartella remota

Si immagini di sviluppare un sito web su apache, presente nella cartella locale /var/www/html/website.  Il sito web in produzione è presente in un server con indirizzo 192.168.0.80.  È stato precedentemente creato un accesso SSH al server con utente user. La cartella del sito in produzione è pubblicata nello stesso percorso della cartella locale. A questo punto per sincronizzare le due cartelle il comando è il seguente:

rsync -avz /var/www/html/website/ user@192.168.0.80:/var/www/html/website

Il comando prende due parametri e tre opzioni. Le opzioni (o flag) sono le seguenti:

  • -a o --archive: modalità archivio, ovvero comprende automaticamente tutti i seguenti parametri:

    • -r, --recursive scorre riscorsivamente tutti i file e le directory a partire dal percorso sorgente

    • -l, --links copia e mantiene i link simbolici

    • -p, --perms preserva i permessi

    • -t, --times preserva la data e ora di modifica dei file

    • -g, --group preserva i gruppi

    • -o, --owner preserva i proprietari

    • -D, lo stesso di --devices e --specials

    • --devices preserva i device file

    • --specials preserva i file special

  • -v o --verbose, incrementa la verbosità del comando, ovvero i messaggi sulla console

  • -z o --compress: comprime i dati durante il trasferimento 

I parametri invece sono due: la cartella sorgente e la cartella di destinazione. È importante notare lo slash alla fine del primo parametro e la sua mancanza alla fine del secondo. Questo significa letteralmente: "sincronizza il contenuto della cartella sorgente sulla cartella destinazione".

La sincronizzazione verifica le differenze tra i singoli file ed effettua una sovrascrizione solo nel momento in cui i due file differiscono. Questo permette di risparmiare una considerevole quantità di tempo in quanto vengono trasferiti solamente i cambiamenti effettuati. Onde evitare errori è fortemente consigliato vedere cosa viene sovrascritto senza attuare modifiche. Per fare ciò è necessario un ulteriore parametro: 

  • -n o --dry-run, esegue un test senza effettuare modifiche

Conclusioni

rsync è un comando di grande utilità, molto semplice da imparare e da usare e che si presta a moltissimi scenari. Nel mondo Linux è fondamentale sapersi destreggiare con la linea di comando e nel bagaglio di ogni programmatore non può mancare la conoscenza di questo strumento.