Uso del comando rsync per sincronizzare file e directory [11 Examples]

rsync è uno strumento da riga di comando gratuito che ti consente di sincronizzare i file in locale e in remoto. Con esso, puoi trasferire file e directory.

Ciò lo rende molto utile per la migrazione dei dati, l’esecuzione di backup e il mirroring, rendendolo ideale per webmaster e amministratori per le attività ricorrenti di trasferimento dei dati.

Questo articolo ci insegnerà come funziona Rysnc e fornirà alcuni esempi utili.

Come funziona rsync?

rsync è un’utilità della riga di comando per la sincronizzazione remota per sistemi simili a Unix. Offre all’utente la possibilità di trasferire/sincronizzare i file tra macchine o due host senza problemi.

Sotto il cofano, rsync utilizza l’algoritmo di trasferimento delta. Questo algoritmo prevede la copia delle differenze tra i due file su due host (origine e destinazione). L’origine e la destinazione possono essere locali o remote. Il comando rsync può eseguire attività di copia/sincronizzazione dei dati in due modi. Questi sono:

  • Usa ssh, rsh per copiare/sincronizzare tra due host.
  • Utilizzare il demone TCP rsync per la copia/sincronizzazione.

Poiché è progettato per funzionare in sistemi simili a Unix, funziona anche in Linux.

Il processo passo-passo utilizzato da rsync è il seguente:

  • Rsync utilizza SSH per connettersi all’host remoto e richiede una password.
  • Una volta connesso, rsync dell’host remoto comunica con l’origine.
  • Questi programmi determineranno quindi i file e le directory che devono essere sincronizzati. Utilizza un algoritmo di trasferimento delta per verificare la differenza tra i file.

Se il comando rsync non trova un file sul telecomando ma non sull’host, lo copierà e lo trasferirà sul sistema host. Allo stesso modo, per i file già esistenti (sia sull’host che sul remoto), copierà la differenza tra loro (cioè le parti modificate). Infine, ignorerà i file esistenti su entrambi i sistemi senza modifiche.

Il comando rsync ottiene aggiornamenti incrementali memorizzando la differenza in un file temporaneo prima di inviarlo alla destinazione.

Prima che inizi:

  • Devi avere i privilegi di root o sudo
  • Avere accesso al terminale/riga di comando
  • Accesso SSH per l’esecuzione sicura dei comandi rsync
  • Hai anche bisogno di due macchine per creare rsync.

Per il tutorial, useremo Linux Mint 21.1 Vera. Puoi facilmente seguire la guida senza problemi utilizzando qualsiasi altra distribuzione Linux.

Perché usare rsync su Scp?

Scp (secure copy) è un popolare protocollo della riga di comando che consente agli utenti di copiare i file. Segue un approccio lineare alla copia. Ciò significa che copia semplicemente i file dall’origine alla destinazione. Per farlo in modo sicuro, utilizza SSH.

La sintassi del comando scp è la seguente:

scp option SOURCE DESTINATION

Tuttavia, la domanda rimane, perché usare rsync su scp?

Bene, ci sono molti vantaggi nell’usare rsync. Questi vantaggi includono:

  • Esecuzione più veloce: rsync è più veloce di scp perché utilizza un protocollo di aggiornamento remoto. Ciò consente di trasferire solo le differenze anziché l’intero file. Pertanto, se imposti una sincronizzazione regolare nel tempo, devi solo eseguire una copia completa la prima volta. Dalla volta successiva in poi, copia solo le parti aggiornate con l’aiuto dell’algoritmo di trasferimento delta.
  • Minor consumo di larghezza di banda: poiché rsync non deve copiare nuovamente l’intero file, porta a un minore consumo di larghezza di banda. Inoltre, utilizza anche algoritmi di compressione/decompressione per ridurre al minimo le dimensioni del file durante il trasferimento.
  • Altre opzioni della riga di comando: rsync batte anche scp nel numero di opzioni della riga di comando. Ciò significa che puoi ottimizzare rsync più di scp.

In conclusione, rsync è un eccellente strumento di sincronizzazione incrementale. Lo strumento scp è utile anche per trasferire/sincronizzare i file in modo sicuro. In uno scenario reale, scp è adatto per le attività quotidiane se stai cercando un approccio più diretto. Tuttavia, per attività ricorrenti, usa rsync.

Sintassi del comando rsync

Il comando rsync è il seguente:

Qui, i termini sono definiti di seguito:

  • OPTION – Queste sono le opzioni di rsync
  • FONTE – Directory di origine
  • DEST – Directory di destinazione
  • USER – Nome utente remoto
  • HOST – Nome host remoto o indirizzo IP

Le opzioni sono parametri che offrono funzionalità aggiuntive al comando. Ad esempio, puoi sincronizzare i dati in modo ricorsivo con l’opzione -r. Tuttavia, l’opzione -r non sincronizza la proprietà per gruppi e utenti, timestamp, autorizzazioni o collegamenti simbolici. Invece, puoi utilizzare l’opzione -a, che esegue il comando in modalità archivio, assicurando che tutti i proprietari, i permessi ei collegamenti simbolici del file vengano mantenuti durante la copia.

Altre opzioni di rsync includono:

  • -z: comprime i dati per risparmiare spazio
  • -h: fornisce un output in formato leggibile dall’uomo
  • -b: esegue il backup durante il processo di sincronizzazione dei dati
  • -e: utilizza il protocollo SSH per i trasferimenti di dati remoti
  • -progress: visualizza l’avanzamento della sincronizzazione dei dati
  • -v: chiede a rsync di visualizzare un output dettagliato
  • –n: esegue un test di prova per testare le impostazioni e l’impostazione per la sincronizzazione dei dati
  • -q: sopprime l’output e le opzioni del comando rsync

Installazione di rsync

La maggior parte dei sistemi Unix e Linux viene fornita con rsync installato. Se il tuo sistema non ha rsync, puoi installarlo usando i seguenti comandi.

Per Debian/Ubuntu e Mint

sudo apt-get install rsync

Per ArcoLinux

pacman -S rsync

Su Gentoo

emerge sys-apps/rsync

Su CentOS/Fedora/REHL

sudo yum install rsync

Su openSUSE

sudo zypper install rsync

Poiché abbiamo Linux Mint, rsync è stato preinstallato. Quindi puoi eseguire il comando rsync nel terminale per vedere se è installato. Spiegherà le sue capacità, opzioni e altre informazioni vitali se presenti.

nitt ~
$ rsync
rsync  version 3.2.3  protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: https://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, hardlink-specials, symlinks, IPv6, atimes,
    batchfiles, inplace, append, ACLs, xattrs, optional protect-args, iconv,
    symtimes, prealloc, stop-at, no crtimes
Optimizations:
    SIMD, no asm, openssl-crypto
Checksum list:
    xxh128 xxh3 xxh64 (xxhash) md5 md4 none
Compress list:
    zstd lz4 zlibx zlib none

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

rsync is a file transfer program capable of efficient remote update
via a fast differencing algorithm.

Vediamo ora rsync in azione con diversi casi d’uso.

Per il tutorial, creeremo due directory.

  • directory-origine
  • directory-destinazione

Per questo, è necessario digitare i seguenti comandi.

mkdir source-directory
mkdir dest-directory

Inoltre, avremo bisogno di generare file per far funzionare rsync. Quindi creiamo alcuni file di test con il comando seguente.

touch source-directory/file{1..100}

Questo crea 100 file vuoti nella directory di origine. Puoi confermarlo inserendo il comando qui sotto.

ls source-directory
Output:
nitt rsync-tutorial
$ ls
dest-directory  source-directory
nitt rsync-tutorial
$ touch source-directory/file{1..100}
nitt rsync-tutorial
$ ls source-directory
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

Nota: abbiamo mantenuto vuota la directory dest.

Copia le directory in locale in modo ricorsivo

Anche se rsync mira principalmente a copiare i file tra un server locale e uno remoto, è ugualmente utile per copiare i file localmente.

In questo caso, useremo la seguente sintassi rsync.

opzione rsync SOURCE DESTINATION

Copia i file nella nostra directory di origine nella directory di destinazione eseguendo il seguente comando.

rsync -r source-directory/ dest-directory

Qui, il comando “ricorsivamente” copia i file dalla directory di origine alla directory di destinazione.

nitt rsync-tutorial
$ ls
dest-directory  source-directory
nitt rsync-tutorial
$ ls dest-directory
nitt rsync-tutorial
$ ls source-directory
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99
nitt rsync-tutorial
$ rsync -r source-directory/ dest-directory
nitt rsync-tutorial
$ ls dest-directory
file1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

Questo copia ogni singolo file nella directory di origine nella directory di destinazione.

Copia file singolo in locale

Ora che abbiamo imparato come sincronizzare due directory, impareremo come copiare un singolo file.

A tale scopo, modificheremo il file vuoto file1 nella directory-origine e poi lo sincronizzeremo con lo stesso file presente nella directory-dest.

Per modificare un file, digitare il seguente comando.

nano source-directory/file1

Ora copia e incolla il seguente testo nel nano editor.

We're updating file1 in the source-directory.
Once we update, we'll push the new update to the dest-directory.
rsync doesn't need to re-copy the file using the delta-transfer algorithm.
This algorithm checks the differences and then updates destination files
accordingly.
So, once you save file1 in the source-directory, open file1 in
the dest-directory. It'll be empty.
However, if we check it after running rsync, you'll see that file1 in dest-directory
is updated.

Aggiunta di contenuto a un file

Ora chiudi e salva il file.

Copiamo ora il file usando rsync.

sudo rsync -v --existing source-directory/file1 /dest-directory
#Output
nitt rsync-tutorial
$ sudo rsync -v --existing source-directory/file1 dest-directory
file1

sent 557 bytes  received 35 bytes  1,184.00 bytes/sec
total size is 474  speedup is 0.80

nitt rsync-tutorial
$ 

Come avrai notato, abbiamo utilizzato l’opzione –existing. Questo aggiorna i file esistenti. Se esegui il comando senza –existing, non si aggiornerà, anche se viene eseguito correttamente.

Se il singolo file che stai copiando non esiste nella cartella di destinazione, devi eseguire il seguente comando.

rsync -v source-directory/newfile dest-directory
#Output
nitt rsync-tutorial
$ rsync -v source-directory/newfile dest-directory
newfile

sent 82 bytes  received 35 bytes  234.00 bytes/sec
total size is 0  speedup is 0.00

Copia di più file

Se intendi copiare più file, devi menzionare i percorsi di origine di entrambi i file, seguiti dalla directory di destinazione.

A questo scopo, creeremo due nuovi file: newfile2 e newfile3, nella directory-source. Esegui il seguente comando per farlo.

touch source-directory/newfile{2..3}

Ora, usa il seguente comando per sincronizzare più file.

rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
#Output
nitt rsync-tutorial
$ rsync -v source-directory/newfile2 source-directory/newfile3 dest-directory
newfile2
newfile3

sent 135 bytes  received 54 bytes  378.00 bytes/sec
total size is 0  speedup is 0.00
nitt rsync-tutorial
$ 

Copia file o directory da locale a remoto

La sintassi rsync per il trasferimento da locale a remoto è la seguente.

rsync option SOURCE [email protected]:DEST

Come puoi vedere, devi conoscere l’indirizzo IP della macchina remota per farlo funzionare. Inoltre, è necessario aggiungere l’indirizzo IP dopo il file di origine.

rsync -av /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Prima di iniziare il trasferimento, chiederà la password. Inseriscilo per continuare. Inoltre, se l’utente è diverso nel computer remoto, è necessario menzionarlo prima dell’indirizzo IP seguito da @.

rsync -av /Projects/rsync-tutorial/source-directory [email protected]: /Projects/rsync-tutorial/dest-directory

Se intendi copiare più file o directory, devi elencare i file o i percorsi delle directory. La sintassi per esso è sotto.

rsync -av /Projects/rsync-tutorial/source-directory/newfile1 /Projects/rsync-tutorial/source-directory/newfile2 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Protocolli specifici per il trasferimento remoto

rsync ti consente di specificare specifici protocolli di trasferimento file. Per farlo, devi usare l’opzione -e, seguita dal protocollo.

Ad esempio, se si desidera utilizzare il protocollo ssh, è necessario aggiungere -e ssh al comando rsync.

rsync -e ssh /Projects/rsync-tutorial/source-directory 192.168.192.200: /Projects/rsync-tutorial/dest-directory

Copia di un file o di una directory da remoto a locale

La sintassi rsync per il trasferimento da locale a remoto è la seguente.

sync option [email protected]:SRC DEST

Funziona come una richiesta pull. Quindi, per ottenere i file/directory richiesti da un server remoto al tuo computer locale, devi eseguire il seguente comando.

rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Il comando estrae i file all’interno della directory di destinazione della macchina remota nella directory di origine della macchina locale.

Allo stesso modo, puoi estrarre un file specifico menzionandolo attraverso il suo percorso completo.

rsync -av 192.168.192.200: /Projects/rsync-tutorial/dest-directory/newfile4 /Projects/rsync-tutorial/source-directory

Per copiare più file o directory da locale a remoto, è necessario specificare il percorso tra parentesi graffe (separate da virgole) dopo l’indirizzo IP del server.

rsync -av 192.168.192.200: {/Projects/rsync-tutorial/dest-directory/, /home/music/2023-music} /Projects/rsync-tutorial/source-directory

Allo stesso modo, puoi menzionare anche i file.

Mostra i progressi in tempo reale durante il trasferimento

È una buona idea vedere i progressi in tempo reale per backup di dati più grandi. Per questo, devi usare il flag –progress. Aggiungilo al comando rsync e puoi vedere la velocità di trasferimento, il tempo rimanente e la quantità di dati trasferiti.

rsync -av --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Elimina i file di origine una volta completato il trasferimento

È possibile utilizzare il flag -remove-source-files per rimuovere i file di origine dopo il trasferimento completo. Questo può aiutarti in molti scenari, soprattutto quando si tratta di proteggere i tuoi file senza lasciare traccia o semplicemente usarli per liberare spazio.

rsync -av --remove-source-files 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

rsync prova a secco

Rysnc ti consente anche di valutare prima di eseguire una corsa effettiva. La corsa a secco ti consente di vedere se stai facendo la cosa giusta. Dopotutto, non vuoi aggiornare i file per errore o addirittura eliminarli.

È necessario utilizzare l’opzione –dry-run per eseguire un funzionamento a secco. Aggiungilo al comando, seguito dall’origine e dalla destinazione.

sudo rsync -v --dry-run source-directory/file1 dest-directory
nitt rsync-tutorial
$ sudo rsync -v --dry-run source-directory/file1 dest-directory
file1

sent 43 bytes  received 19 bytes  124.00 bytes/sec
total size is 474  speedup is 7.65 (DRY RUN)
nitt rsync-tutorial

L’output è simile a come lo abbiamo eseguito prima. Tuttavia, noterai una menzione di (DRY RUN) alla fine dell’output.

Imposta la dimensione minima e massima del file

Rysnc ti consente anche di impostare la dimensione minima o massima del file durante il trasferimento.

Quindi, se vuoi trasferire con una dimensione minima di 15KB, devi usare –min-size=15K.

rsync -av --min-size=15k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Il comando copierà solo i file con una dimensione minima del file di 15 KB. Se la dimensione del file è inferiore, la ignorerà.

Allo stesso modo, puoi usare il flag –max-size per impostare la dimensione massima del file.

rsync -av --max-size=450k 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Qui, rsync ignorerà i file al di sopra della dimensione di 450K.

Imposta il limite di larghezza di banda

Se stai eseguendo altre attività che richiedono molta larghezza di banda, puoi impostare rysnc per impostare il limite di larghezza di banda per il trasferimento. Per farlo, usa –bwlimit=KB/s.

rsync -av --bwlimit=100 --progress 192.168.192.200: /Projects/rsync-tutorial/dest-directory /Projects/rsync-tutorial/source-directory

Qui impostiamo la larghezza di banda a 100Kb/s durante il trasferimento.

Parole finali

Questo ci porta alla fine della nostra guida ai comandi rsync. Abbiamo imparato a usare rysnc e coperto molti comandi in modo efficace.

Tuttavia, rysnc offre molto di più di quello che abbiamo coperto. Ecco perché potresti anche voler consultare la pagina man di rsync, dove è trattato ogni aspetto di rsync.

Successivamente, controlla i cheat sheet della riga di comando per Windows, Linux e macOS.