Použití příkazu rsync k synchronizaci souborů a adresářů [11 Examples]

Úvod do rsync a jeho praktické využití

rsync je bezplatný nástroj, který se spouští z příkazové řádky a slouží k synchronizaci souborů jak v rámci jednoho počítače, tak i mezi různými zařízeními. Umožňuje efektivní přenos souborů a celých adresářů.

Díky svým vlastnostem je rsync velmi oblíbený při migracích dat, zálohování a zrcadlení. Je neocenitelný pro webmastery a administrátory, kteří pravidelně provádějí přenosy dat.

V tomto článku si podrobně vysvětlíme, jak rsync funguje, a ukážeme si několik praktických příkladů jeho použití.

Jak rsync technicky funguje?

rsync je nástroj pro vzdálenou synchronizaci, který je určen pro operační systémy typu Unix. Umožňuje uživatelům snadno přenášet nebo synchronizovat soubory mezi různými počítači nebo servery.

V jádru rsync pracuje na základě algoritmu delta-transfer. Tento algoritmus spočívá v kopírování pouze rozdílů mezi dvěma soubory na zdrojovém a cílovém umístění. Zdroj i cíl mohou být umístěny lokálně, nebo na vzdálených serverech. Příkaz rsync je schopen provádět kopírování nebo synchronizaci dat dvěma různými způsoby:

  • Přes protokoly ssh nebo rsh pro synchronizaci mezi dvěma hostiteli.
  • Prostřednictvím rsync TCP démona.

Protože byl navržen pro Unixové systémy, skvěle funguje i na Linuxu.

Proces synchronizace v rsync probíhá následovně:

  • Rsync se pomocí SSH připojí ke vzdálenému serveru, kde může být vyžadováno heslo.
  • Po připojení rsync komunikuje se zdrojovým umístěním.
  • Programy následně identifikují soubory a adresáře, které je třeba synchronizovat. Pro detekci rozdílů se využívá algoritmus delta transfer.

Pokud rsync nenajde na vzdáleném zařízení soubor, který je na hostitelském počítači, tak jej zkopíruje a přenese. V případě již existujících souborů zkopíruje pouze změněné části. Pokud soubor existuje v obou umístěních beze změn, tak jej ignoruje.

Příkaz rsync provádí inkrementální aktualizace tím, že ukládá rozdíly do dočasného souboru před odesláním do cíle.

Před zahájením práce s rsync je nutné:

  • Mít práva roota nebo sudo.
  • Mít přístup k terminálu nebo příkazové řádce.
  • Mít SSH přístup pro bezpečné spouštění rsync příkazů.
  • Disponovat dvěma počítači pro testování.

V tomto tutoriálu budeme používat Linux Mint 21.1 Vera. Nicméně, tento návod je aplikovatelný i pro další linuxové distribuce.

Proč preferovat rsync před scp?

scp (secure copy) je běžně používaný protokol pro kopírování souborů z příkazové řádky. Postupuje lineárně, což znamená, že prostě kopíruje soubory ze zdroje do cíle. Pro zabezpečení přenosu využívá SSH.

Základní syntaxe příkazu scp vypadá takto:

scp option SOURCE DESTINATION

Proč byste tedy měli používat rsync místo scp?

Používání rsync má řadu výhod, které zahrnují:

  • Rychlejší přenos: rsync je obvykle rychlejší než scp, protože využívá protokol vzdálené aktualizace. Díky tomu přenáší pouze rozdíly, nikoliv celé soubory. To je zvláště výhodné při pravidelné synchronizaci, kdy se první kopie provede celá a následně se přenáší jen změny.
  • Snížená spotřeba šířky pásma: Tím, že rsync nekopíruje znovu celé soubory, spotřebovává méně šířky pásma. Navíc používá kompresní algoritmy pro minimalizaci velikosti souborů během přenosu.
  • Více možností: rsync nabízí více možností v příkazové řádce než scp, což umožňuje jemnější nastavení.

Závěrem, rsync je skvělý nástroj pro inkrementální synchronizaci. scp je užitečný pro bezpečný přenos souborů. Pro běžné úkoly, kde je vyžadován přímočarý přístup, je scp vhodný. Nicméně, pro opakující se úlohy byste měli používat rsync.

Základní syntaxe příkazu rsync

Základní struktura příkazu rsync je:

rsync OPTION SOURCE DEST

Pojďme si tyto pojmy definovat:

  • OPTION – možnosti příkazu rsync.
  • SOURCE – zdrojový adresář.
  • DEST – cílový adresář.
  • USER – uživatelské jméno vzdáleného uživatele.
  • HOST – jméno vzdáleného hostitele nebo jeho IP adresa.

Možnosti (options) jsou parametry, které rozšiřují funkcionalitu příkazu. Například, můžete rekurzivně synchronizovat data pomocí volby `-r`. Nicméně, volba `-r` nesynchronizuje vlastnictví skupin a uživatelů, časové značky, oprávnění nebo symbolické odkazy. Proto je doporučeno používat volbu `-a`, která spustí rsync v archivním režimu a zachová všechna vlastnictví, oprávnění a symbolické odkazy souborů.

Mezi další užitečné volby rsync patří:

  • `-z`: komprimuje data pro úsporu místa.
  • `-h`: poskytuje výstup v lidsky čitelném formátu.
  • `-b`: provede zálohu během synchronizace dat.
  • `-e`: používá protokol SSH pro vzdálené přenosy dat.
  • `–progress`: zobrazuje průběh synchronizace dat.
  • `-v`: požaduje podrobný výstup.
  • `-n`: provede testovací běh pro ověření nastavení synchronizace.
  • `-q`: potlačí výstup a volby příkazu rsync.

Instalace rsync

Ve většině Unixových a Linuxových systémů je rsync již předinstalován. Pokud váš systém rsync nemá, můžete jej nainstalovat pomocí následujících příkazů.

Pro Debian, Ubuntu a Mint:

sudo apt-get install rsync

Pro Arch Linux:

pacman -S rsync

Pro Gentoo:

emerge sys-apps/rsync

Pro CentOS, Fedora a REHL:

sudo yum install rsync

Pro openSUSE:

sudo zypper install rsync

Protože používáme Linux Mint, rsync je již předinstalován. Můžete spustit příkaz `rsync` v terminálu, a pokud je nainstalovaný, zobrazí se jeho možnosti a další informace.

$ 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.

Nyní se podívejme na praktické využití rsync.

Pro tento tutoriál vytvoříme dva adresáře:

  • zdrojový-adresář
  • cílový-adresář

To provedete pomocí následujících příkazů:

mkdir zdrojový-adresář
mkdir cílový-adresář

Pro otestování funkce rsync je potřeba vytvořit soubory. Použijte níže uvedený příkaz pro vytvoření testovacích souborů:

touch zdrojový-adresář/soubor{1..100}

Tím se ve zdrojovém adresáři vytvoří 100 prázdných souborů. Můžete si to ověřit pomocí příkazu níže:

ls zdrojový-adresář
Výstup:
cílový-adresář  zdrojový-adresář
$ touch zdrojový-adresář/soubor{1..100}
$ ls zdrojový-adresář
soubor1    soubor18  soubor27  soubor36  soubor45  soubor54  soubor63  soubor72  soubor81  soubor90
soubor10   soubor19  soubor28  soubor37  soubor46  soubor55  soubor64  soubor73  soubor82  soubor91
soubor100  soubor2   soubor29  soubor38  soubor47  soubor56  soubor65  soubor74  soubor83  soubor92
soubor11   soubor20  soubor3   soubor39  soubor48  soubor57  soubor66  soubor75  soubor84  soubor93
soubor12   soubor21  soubor30  soubor4   soubor49  soubor58  soubor67  soubor76  soubor85  soubor94
soubor13   soubor22  soubor31  soubor40  soubor5   soubor59  soubor68  soubor77  soubor86  soubor95
soubor14   soubor23  soubor32  soubor41  soubor50  soubor6   soubor69  soubor78  soubor87  soubor96
soubor15   soubor24  soubor33  soubor42  soubor51  soubor60  soubor7   soubor79  soubor88  soubor97
soubor16   soubor25  soubor34  soubor43  soubor52  soubor61  soubor70  soubor8   soubor89  soubor98
soubor17   soubor26  soubor35  soubor44  soubor53  soubor62  soubor71  soubor80  soubor9   soubor99

Poznámka: cílový adresář je prozatím prázdný.

Rekurzivní lokální kopírování adresářů

Přestože je rsync primárně určen pro kopírování mezi lokálním a vzdáleným serverem, je stejně efektivní pro lokální kopírování souborů.

V tomto případě použijeme syntaxi rsync:

rsync option ZDROJ CÍL

Pro zkopírování souborů ze zdrojového do cílového adresáře, spusťte tento příkaz:

rsync -r zdrojový-adresář/ cílový-adresář

Tento příkaz rekurzivně zkopíruje veškerý obsah zdrojového adresáře do cílového.

$ ls
cílový-adresář  zdrojový-adresář
$ ls cílový-adresář
$ ls zdrojový-adresář
soubor1    soubor18  soubor27  soubor36  soubor45  soubor54  soubor63  soubor72  soubor81  soubor90
soubor10   soubor19  soubor28  soubor37  soubor46  soubor55  soubor64  soubor73  soubor82  soubor91
soubor100  soubor2   soubor29  soubor38  soubor47  soubor56  soubor65  soubor74  soubor83  soubor92
soubor11   soubor20  soubor3   soubor39  soubor48  soubor57  soubor66  soubor75  soubor84  soubor93
soubor12   soubor21  soubor30  soubor4   soubor49  soubor58  soubor67  soubor76  soubor85  soubor94
soubor13   soubor22  soubor31  soubor40  soubor5   soubor59  soubor68  soubor77  soubor86  soubor95
soubor14   soubor23  soubor32  soubor41  soubor50  soubor6   soubor69  soubor78  soubor87  soubor96
soubor15   soubor24  soubor33  soubor42  soubor51  soubor60  soubor7   soubor79  soubor88  soubor97
soubor16   soubor25  soubor34  soubor43  soubor52  soubor61  soubor70  soubor8   soubor89  soubor98
soubor17   soubor26  soubor35  soubor44  soubor53  soubor62  soubor71  soubor80  soubor9   soubor99
$ rsync -r zdrojový-adresář/ cílový-adresář
$ ls cílový-adresář
soubor1    soubor18  soubor27  soubor36  soubor45  soubor54  soubor63  soubor72  soubor81  soubor90
soubor10   soubor19  soubor28  soubor37  soubor46  soubor55  soubor64  soubor73  soubor82  soubor91
soubor100  soubor2   soubor29  soubor38  soubor47  soubor56  soubor65  soubor74  soubor83  soubor92
soubor11   soubor20  soubor3   soubor39  soubor48  soubor57  soubor66  soubor75  soubor84  soubor93
soubor12   soubor21  soubor30  soubor4   soubor49  soubor58  soubor67  soubor76  soubor85  soubor94
soubor13   soubor22  soubor31  soubor40  soubor5   soubor59  soubor68  soubor77  soubor86  soubor95
soubor14   soubor23  soubor32  soubor41  soubor50  soubor6   soubor69  soubor78  soubor87  soubor96
soubor15   soubor24  soubor33  soubor42  soubor51  soubor60  soubor7   soubor79  soubor88  soubor97
soubor16   soubor25  soubor34  soubor43  soubor52  soubor61  soubor70  soubor8   soubor89  soubor98
soubor17   soubor26  soubor35  soubor44  soubor53  soubor62  soubor71  soubor80  soubor9   soubor99

Tímto způsobem se zkopíruje každý soubor ze zdrojového adresáře do cílového.

Kopírování jednoho souboru lokálně

Nyní, když víme, jak synchronizovat dva adresáře, se podíváme na kopírování jednoho souboru.

Pro tento účel upravíme prázdný soubor `soubor1` ve zdrojovém adresáři a následně jej synchronizujeme do cílového adresáře.

Pro editaci souboru, použijte následující příkaz:

nano zdrojový-adresář/soubor1

Nyní do nano editoru vložte následující text:

Aktualizujeme soubor1 ve zdrojovém-adresáři.
Po aktualizaci přeneseme novou verzi do cílového-adresáře.
rsync nepotřebuje znovu kopírovat celý soubor díky algoritmu delta-transfer.
Tento algoritmus kontroluje rozdíly a aktualizuje cílové soubory.
Pokud soubor1 uložíte ve zdrojovém adresáři a otevřete v cílovém,
uvidíte, že je prázdný.
Nicméně, pokud se podíváte po spuštění rsync,
uvidíte, že soubor1 v cílovém adresáři je aktualizován.

Po přidání obsahu soubor uložte a zavřete.

Nyní zkopírujeme soubor pomocí rsync:

sudo rsync -v --existing zdrojový-adresář/soubor1 /cílový-adresář
Výstup:
$ sudo rsync -v --existing zdrojový-adresář/soubor1 cílový-adresář
soubor1

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

Jak jste si mohli všimnout, použili jsme možnost `–existing`. Tímto se aktualizují stávající soubory. Pokud příkaz spustíte bez `–existing`, soubor se neaktualizuje, i když příkaz proběhne bez chyby.

Pokud soubor, který chcete kopírovat, v cílovém adresáři neexistuje, musíte spustit následující příkaz:

rsync -v zdrojový-adresář/novýsoubor cílový-adresář
Výstup:
$ rsync -v zdrojový-adresář/novýsoubor cílový-adresář
novýsoubor

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

Kopírování více souborů

Pro kopírování více souborů musíte uvést zdrojové cesty obou souborů následované cílovým adresářem.

Pro tento účel vytvoříme dva nové soubory `novýsoubor2` a `novýsoubor3` v zdrojovém adresáři. To provedete pomocí následujícího příkazu:

touch zdrojový-adresář/novýsoubor{2..3}

Nyní použijte tento příkaz pro synchronizaci více souborů:

rsync -v zdrojový-adresář/novýsoubor2 zdrojový-adresář/novýsoubor3 cílový-adresář
Výstup:
$ rsync -v zdrojový-adresář/novýsoubor2 zdrojový-adresář/novýsoubor3 cílový-adresář
novýsoubor2
novýsoubor3

sent 135 bytes  received 54 bytes  378.00 bytes/sec
total size is 0  speedup is 0.00

Kopírování souboru nebo adresáře z lokálního na vzdálený server

Syntaxe rsync pro přenos z lokálního na vzdálený server je následující:

rsync option ZDROJ [email protected]:CÍL

Pro tento příkaz budete potřebovat IP adresu vzdáleného počítače. Můžete také přidat IP adresu ke zdrojovému souboru.

rsync -av /Projekty/rsync-tutoriál/zdrojový-adresář 192.168.192.200: /Projekty/rsync-tutoriál/cílový-adresář

Před zahájením přenosu budete vyzváni k zadání hesla. Pokud je uživatel na vzdáleném serveru jiný, musíte uvést jeho jméno před IP adresou oddělené znakem `@`.

rsync -av /Projekty/rsync-tutoriál/zdrojový-adresář [email protected]: /Projekty/rsync-tutoriál/cílový-adresář

Pro kopírování více souborů nebo adresářů je nutné uvést seznam cest k souborům či adresářům. Syntax je následující:

rsync -av /Projekty/rsync-tutoriál/zdrojový-adresář/novýsoubor1 /Projekty/rsync-tutoriál/zdrojový-adresář/novýsoubor2 192.168.192.200: /Projekty/rsync-tutoriál/cílový-adresář

Specifické protokoly pro vzdálený přenos

rsync umožňuje nastavit specifické protokoly pro přenos souborů. Toho docílíte použitím volby `-e` a následně jména protokolu.

Pro využití protokolu ssh je nutné přidat do příkazu rsync `-e ssh`.

rsync -e ssh /Projekty/rsync-tutoriál/zdrojový-adresář 192.168.192.200: /Projekty/rsync-tutoriál/cílový-adresář

Kopírování souboru nebo adresáře ze vzdáleného na lokální server

Syntaxe rsync pro přenos ze vzdáleného na lokální server vypadá takto:

rsync option [email protected]:ZDROJ CÍL

Funguje to jako požadavek pro stahování. Chcete-li stáhnout soubory nebo adresáře ze vzdáleného serveru na lokální počítač, musíte spustit následující příkaz:

rsync -av 192.168.192.200: /Projekty/rsync-tutoriál/cílový-adresář /Projekty/rsync-tutoriál/zdrojový-adresář

Tento příkaz stáhne soubory z cílového adresáře vzdáleného počítače do zdrojového adresáře na vašem počítači.

Stejně tak můžete stáhnout i konkrétní soubor, pokud určíte jeho celou cestu.

rsync -av 192.168.192.200: /Projekty/rsync-tutoriál/cílový-adresář/novýsoubor4 /Projekty/rsync-tutoriál/zdrojový-adresář

Pro zkopírování více souborů nebo adresářů ze vzdáleného na lokální server, zadejte cesty ve složených závorkách, oddělené čárkou, za IP adresou serveru:

rsync -av 192.168.192.200: {/Projekty/rsync-tutoriál/cílový-adresář/, /home/hudba/2023-hudba} /Projekty/rsync-tutoriál/zdrojový-adresář

Podobně můžete uvést i soubory.

Zobrazení průběhu přenosu

Při přenosu větších dat je užitečné sledovat průběh. K tomu použijte parametr `–progress`. Přidejte jej do příkazu rsync, a uvidíte rychlost přenosu, zbývající čas a objem přenesených dat.

rsync -av --progress 192.168.192.200: /Projekty/rsync-tutoriál/cílový-adresář /Projekty/rsync-tutoriál/zdrojový-adresář

Odstranění zdrojových souborů po dokončení přenosu

Pro odstranění zdrojových souborů po dokončení přenosu použijte volbu `–remove-source-files`. Může to být užitečné v různých situacích, například pokud chcete zabezpečit soubory bez zanechání stopy nebo uvolnit místo.

rsync -av --remove-source-files 192.168.192.200: /Projekty/rsync-tutoriál/cílový-adresář /Projekty/rsync-tutoriál/zdrojový-adresář

Testovací běh rsync

Rsync umožňuje vyhodnocení příkazu před jeho spuštěním. Tato volba testovacího běhu (dry run) vám umožní zjistit, zda provádíte správné kroky, a zabrání nechtěným aktualizacím nebo smazání dat.

Pro spuštění testovacího běhu použijte volbu `–dry-run`. Přidejte ji do příkazu rsync následovanou zdrojem a cílem.

sudo rsync -v --dry-run zdrojový-adresář/soubor1 cílový-adresář
Výstup:
$ sudo rsync -v --dry-run zdrojový-adresář/soubor1 cílový-adresář
soubor1

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

Výstup je podobný jako při normálním spuštění, avšak na konci výstupu je uvedeno `(DRY RUN)`.

Nastavení minimální a maximální velikosti souboru

Rsync umožňuje nastavit minimální nebo maximální velikost souboru pro přenos.

Pokud chcete přenášet soubory s minimální velikostí 15 KB, použijte `–min-size=15k`.

rsync -av --min-size=15k 192.168.192.200: /Projekty/rsync-tutoriál/cílový-adresář /Projekty/rsync-tutoriál/zdrojový-adresář

Příkaz zkopíruje pouze soubory o velikosti minimálně 15 KB. Menší soubory budou ignorovány.

Stejně tak můžete použít volbu `–max-size` pro nastavení maximální velikosti souborů.

rsync -av --max-size=450k 192.168.192.200: /Projekty/rsync-tutoriál/cílový-adresář /Projekty/rsync-tutoriál/zdrojový-adresář

V tomto případě rsync ignoruje soubory větší než 450 KB.

Nastavení omezení šířky pásma

Pokud provádíte jiné operace náročné na šířku pásma, můžete omezit šířku pásma pro přenos pomocí rsync. Pro tento účel použijte `–bwlimit=KB/s`.

rsync -av --bwlimit=100 --progress 192.168.192.200: /Projekty/rsync-tutoriál/cílový-adresář /Projekty/rsync-tutoriál/zdrojový-adresář

Zde jsme nastavili šířku pásma pro přenos na 100 KB/s.

Závěr

Tímto se dostáváme na konec tohoto průvodce pro příkazy rsync. Naučili jsme se efektivně používat rsync a pokryli jsme mnoho příkazů.

Nicméně, rsync nabízí ještě více funkcí. Doporučujeme vám prostudovat manuálovou stránku rsync, kde najdete podrobné informace.

Dále se podívejte na zkratky příkazové řádky pro Windows, Linux a macOS.