Utilizarea comenzii rsync pentru a sincroniza fișiere și directoare [11 Examples]

Explorarea Capacităților Instrumentului Rsync

Rsync reprezintă un utilitar de tip linie de comandă, oferit gratuit, care permite sincronizarea eficientă a fișierelor, atât local, cât și la distanță. Prin intermediul său, utilizatorii pot transfera cu ușurință fișiere și directoare între diferite locații.

Datorită versatilității sale, rsync se dovedește a fi extrem de valoros pentru diverse sarcini, cum ar fi migrarea datelor, realizarea de copii de siguranță (backup) și crearea de copii identice (mirroring). Acesta este un instrument esențial pentru webmasteri și administratori, facilitând sarcinile repetitive de transfer de informații.

În acest articol, vom analiza funcționalitățile rsync și vom prezenta câteva exemple practice pentru a ilustra cum poate fi utilizat în diverse situații.

Cum Funcționează Rsync?

Rsync este conceput ca un instrument de sincronizare de la distanță, ideal pentru sistemele bazate pe Unix. Acesta oferă posibilitatea de a muta și sincroniza date între două computere, fie că sunt în aceeași rețea sau la distanță, într-un mod simplu și eficient.

La bază, rsync folosește un algoritm de transfer delta. Această metodă presupune copierea numai a diferențelor dintre fișierele de pe sursă și cele de pe destinație. Atât sursa, cât și destinația pot fi locații locale sau la distanță. Comanda rsync poate îndeplini operații de copiere/sincronizare în două moduri principale:

  • Utilizarea protocoalelor SSH sau RSH pentru a sincroniza date între două mașini.
  • Utilizarea demonului TCP rsync pentru sincronizare.

Fiind proiectat să opereze în medii de tip Unix, rsync funcționează impecabil și în sistemele Linux.

Procesul de sincronizare realizat de rsync se desfășoară în următorii pași:

  • Rsync folosește SSH pentru a se conecta la mașina de la distanță și, în mod normal, solicită o parolă.
  • Odată conexiunea stabilită, rsync de pe mașina de la distanță comunică cu cea sursă.
  • Cele două componente identifică fișierele și directoarele care necesită sincronizare, utilizând algoritmul de transfer delta pentru a detecta diferențele.

În situația în care comanda rsync nu găsește un fișier pe destinație, dar îl găsește pe sursă, acesta va fi copiat în destinație. Similar, dacă fișierul există atât pe sursă cât și pe destinație, rsync va copia doar modificările. Fișierele identice pe ambele sisteme vor fi ignorate.

Rsync realizează actualizări incrementale, stocând diferențele într-un fișier temporar înainte de a le aplica în destinație.

Înainte de a începe, este necesar să îndepliniți următoarele condiții:

  • Să dețineți privilegii de tip root sau sudo.
  • Să aveți acces la terminal/linie de comandă.
  • Să aveți acces SSH pentru a executa comenzile rsync în mod sigur.
  • Să dispuneți de două mașini pentru a testa rsync.

Pentru a demonstra, vom folosi Linux Mint 21.1 Vera. Ghidul poate fi urmat cu ușurință pe orice altă distribuție Linux, fără probleme.

De Ce să Optăm pentru Rsync în Defavoarea Scp?

Scp (secure copy) este un protocol de linie de comandă frecvent utilizat pentru copierea de fișiere. Acesta funcționează într-un mod simplu, transferând fișiere de la sursă la destinație. Securitatea transferului este asigurată prin utilizarea SSH.

Sintaxa comenzii scp este următoarea:

scp option SOURCE DESTINATION

Cu toate acestea, se ridică întrebarea: de ce să alegem rsync în locul scp?

Utilizarea rsync oferă multiple avantaje, printre care:

  • Viteză de execuție superioară: Rsync este mai rapid decât scp, datorită protocolului de actualizare la distanță, care permite transferul doar a modificărilor, nu a întregului fișier. Astfel, după o primă copiere completă, următoarele sincronizări vor fi mult mai rapide, datorită algoritmului de transfer delta.
  • Consum redus de lățime de bandă: Deoarece rsync nu mai trebuie să copieze integral fișierul, rezultă un consum semnificativ mai mic de lățime de bandă. În plus, utilizează algoritmi de compresie și decompresie, reducând dimensiunea fișierelor în timpul transferului.
  • Mai multe opțiuni de linie de comandă: Rsync oferă un număr mai mare de opțiuni de configurare decât scp. Acest lucru oferă utilizatorilor un control mai mare asupra procesului de sincronizare.

În concluzie, rsync este un instrument foarte eficient pentru sincronizarea incrementală. Scp este, de asemenea, util pentru transferul de fișiere, oferind o abordare mai directă. În utilizarea de zi cu zi, scp este potrivit pentru sarcinile simple, în timp ce rsync este preferabil pentru operațiunile repetitive, datorită avantajelor sale.

Sintaxa Comenzii Rsync

Sintaxa comenzii rsync este:

rsync OPTIUNE SOURCE DEST

unde termenii sunt definiți după cum urmează:

  • OPȚIUNE – Parametrii de configurare a rsync.
  • SOURCE – Directorul sursă.
  • DEST – Directorul de destinație.

Pentru transferurile la distanță, sintaxa este:

rsync OPTIUNE SOURCE [email protected]:DEST
  • UTILIZATOR – Numele de utilizator de pe mașina de la distanță.
  • HOST – Numele mașinii de la distanță sau adresa IP.

Opțiunile sunt parametrii care adaugă funcționalități suplimentare comenzii. De exemplu, opțiunea `-r` permite sincronizarea recursivă a datelor. Cu toate acestea, această opțiune nu păstrează proprietatea grupului și a utilizatorului, timestamp-urile, permisiunile sau legăturile simbolice. Pentru a face acest lucru, se poate utiliza opțiunea `-a`, care rulează comanda în mod arhivă, asigurând copierea tuturor proprietăților și permisiunilor.

Alte opțiuni importante de sincronizare includ:

  • -z: comprimarea datelor pentru a reduce dimensiunea transferului.
  • -h: afișarea informațiilor într-un format ușor de citit.
  • -b: realizarea unei copii de rezervă înainte de sincronizare.
  • -e: utilizarea protocolului SSH pentru transferuri de date de la distanță.
  • –progress: afișarea progresului sincronizării.
  • -v: afișarea unei ieșiri detaliate.
  • –n: efectuarea unei rulări de test, fără a face modificări reale.
  • -q: suprimarea afișării de informații și opțiuni ale comenzii rsync.

Instalarea Rsync

Rsync este de obicei preinstalat pe majoritatea sistemelor Unix și Linux. Dacă nu este disponibil pe sistemul dumneavoastră, poate fi instalat folosind comenzile de mai jos.

Pentru Debian/Ubuntu și Mint:

sudo apt-get install rsync

Pentru Arch Linux:

pacman -S rsync

Pentru Gentoo:

emerge sys-apps/rsync

Pentru CentOS/Fedora/REHL:

sudo yum install rsync

Pentru openSUSE:

sudo zypper install rsync

Deoarece folosim Linux Mint, rsync este deja preinstalat. Pentru a verifica instalarea, se poate rula comanda rsync în terminal, care va afișa informații despre capacitățile și opțiunile disponibile.

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.

În continuare, vom demonstra utilizarea practică a rsync în diverse scenarii.

Pentru demonstrație, vom crea două directoare:

  • sursă-director
  • dest-director

Pentru a crea aceste directoare, utilizați următoarele comenzi:

mkdir source-directory
mkdir dest-directory

Vom genera și câteva fișiere de test, utilizând comanda de mai jos:

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

Această comandă creează 100 de fișiere goale în directorul sursă. Putem verifica acest lucru cu ajutorul comenzii:

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

Notă: Directorul dest este lăsat gol.

Copiere Recursivă a Directoarelor Local

Deși rsync este conceput în primul rând pentru a copia fișiere între un server local și unul de la distanță, poate fi folosit la fel de bine pentru a copia fișiere local.

În acest caz, vom folosi următoarea sintaxă rsync:

rsync opțiunea SOURCE DESTINATION

Pentru a copia toate fișierele din directorul sursă în directorul dest, rulăm următoarea comandă:

rsync -r source-directory/ dest-directory

Opțiunea „-r” permite copierea recursivă a tuturor fișierelor și subdirectoarelor.

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

În urma acestei comenzi, toate fișierele din directorul sursă sunt copiate în directorul dest.

Copierea unui Singur Fișier Local

Acum că am demonstrat cum să sincronizăm două directoare, vom învăța cum să copiem un singur fișier.

Pentru a face acest lucru, vom edita fișierul gol `file1` din directorul sursă și îl vom sincroniza cu același fișier din directorul dest.

Pentru a edita fișierul, folosim comanda:

nano source-directory/file1

În editorul nano, vom introduce următorul text:

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.

După adăugarea conținutului, vom închide și salva fișierul.

Vom copia acum fișierul folosind rsync, cu următoarea comandă:

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
$ 

Am utilizat opțiunea `–existing`, care permite actualizarea fișierelor existente. Dacă rulăm comanda fără această opțiune, fișierul nu se va actualiza, chiar dacă comanda rulează cu succes.

În cazul în care fișierul pe care îl dorim să îl copiem nu există în directorul de destinație, vom utiliza următoarea comandă:

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

Copierea Mai Multor Fișiere

Pentru a copia mai multe fișiere, se specifică căile sursă ale fișierelor, urmate de directorul destinație.

În acest scop, vom crea două fișiere noi, `newfile2` și `newfile3`, în directorul sursă, folosind comanda:

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

Vom sincroniza cele două fișiere cu următoarea comandă:

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
$ 

Copierea Fişierelor sau a Directoarelor de la Local la Distanţă

Sintaxa rsync pentru transferul de la local la distanță este următoarea:

rsync option SOURCE [email protected]:DEST

Pentru a realiza această operațiune, trebuie să cunoaștem adresa IP a mașinii de la distanță. Adresa IP se adaugă după fișierul sursă.

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

Înainte de transfer, se va cere parola utilizatorului. Dacă utilizatorul de pe mașina de la distanță este diferit, acesta trebuie specificat înainte de adresa IP, urmată de caracterul `@`.

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

Pentru a copia mai multe fișiere sau directoare, este necesară enumerarea acestora, separând căile.

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

Protocoale Specifice pentru Transferul de la Distanță

Rsync permite specificarea anumitor protocoale pentru transferul fișierelor. Se utilizează opțiunea `-e`, urmată de protocolul dorit.

De exemplu, pentru a utiliza protocolul SSH:

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

Copierea unui Fișier sau Director de la Distanță la Local

Sintaxa rsync pentru transferul de la distanță la local este următoarea:

rsync option [email protected]:SRC DEST

Această operațiune este echivalentă cu o comandă de tip `pull`. Pentru a transfera fișierele necesare de pe un server la distanță pe mașina locală, vom utiliza comanda de mai jos:

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

Această comandă copiază fișierele din directorul `dest` al mașinii de la distanță în directorul `source` al mașinii locale.

În mod similar, un anumit fișier poate fi transferat specificând calea completă a acestuia:

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

Pentru a copia mai multe fișiere sau directoare de la distanță la local, se specifică calea între paranteze, separată prin virgulă, după adresa IP a serverului.

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

În mod similar, se pot specifica și fișiere.

Afișarea Progresului Live în Timpul Transferului

Pentru operațiunile de transfer de date mai mari, este important să vedem progresul în timp real. Opțiunea `–progress` permite afișarea vitezei de transfer, a timpului rămas și a cantității de date transferate.

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

Ștergerea Fișierelor Sursă După Finalizarea Transferului

Opțiunea `–remove-source-files` permite ștergerea fișierelor sursă după finalizarea transferului, ceea ce poate fi util pentru securizarea fișierelor sau eliberarea spațiului.

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

Rsync – Funcționare de Test

Rsync oferă posibilitatea de a efectua o rulare de test, pentru a evalua modificările înainte de a le aplica. Această funcționalitate, cunoscută sub numele de `dry run`, permite verificarea corectitudinii operațiunilor.

Pentru a efectua o rulare de test, utilizăm opțiunea `–dry-run`, specificată în comandă, urmată de sursă și destinație.

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

Ieșirea este similară cu cea a unei operațiuni normale, dar include mențiunea `(DRY RUN)` la sfârșit.

Setarea Dimensiunii Minime și Maxime a Fișierului

Rsync permite setarea dimensiunilor minime și maxime ale fișierelor care vor fi transferate.

Pentru a transfera doar fișiere cu o dimensiune minimă de 15KB, utilizăm opțiunea `–min-size=15k`.

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

Comanda va copia numai fișierele care au o dimensiune minimă de 15KB, ignorând fișierele mai mici.

Pentru a seta dimensiunea maximă a fișierului, utilizăm opțiunea `–max-size`.

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

În acest caz, rsync va ignora fișierele care depășesc dimensiunea de 450KB.

Setarea Limitei Lățimii de Bandă

Pentru a limita lățimea de bandă utilizată de rsync în timpul transferului, utilizăm opțiunea `–bwlimit=KB/s`.

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

În acest exemplu, lățimea de bandă este limitată la 100KB/s în timpul transferului.

Concluzie

Am ajuns la finalul acestui ghid despre comanda rsync. Am învățat cum să folosim rsync și am explorat o serie de comenzi utile.

Cu toate acestea, rsync oferă mult mai multe funcționalități. Pentru a explora toate detaliile, se recomandă consultarea manualului rsync, care acoperă fiecare aspect al acestui utilitar.

În plus, puteți consulta și diverse fișe de referință (cheat sheets) pentru linia de comandă în Windows, Linux și macOS.