Verwendung des rsync-Befehls zum Synchronisieren von Dateien und Verzeichnissen (11 Beispiele)

Einführung in rsync: Ein vielseitiges Synchronisierungstool

rsync ist ein kostenloses, auf der Kommandozeile basierendes Dienstprogramm, das das Synchronisieren von Dateien sowohl lokal als auch über das Netzwerk ermöglicht. Es dient dazu, Dateien und ganze Verzeichnisstrukturen effizient zu übertragen.

Dies macht rsync besonders wertvoll für Datenmigrationen, Backups und das Spiegeln von Daten. Webmaster und Systemadministratoren profitieren insbesondere von rsync bei wiederkehrenden Aufgaben der Datenübertragung.

Im Folgenden werden wir die Funktionsweise von rsync detailliert erläutern und einige praktische Anwendungsbeispiele vorstellen.

Wie funktioniert rsync im Detail?

rsync ist ein Kommandozeilenprogramm, das speziell für die Fernsynchronisation unter Unix-ähnlichen Betriebssystemen entwickelt wurde. Es erlaubt Nutzern, Daten zwischen Computern oder verschiedenen Hosts nahtlos zu verschieben oder zu synchronisieren.

Im Kern arbeitet rsync mit dem sogenannten Delta-Transfer-Algorithmus. Dieser Algorithmus vergleicht die Dateien auf dem Quell- und Zielsystem und kopiert lediglich die Unterschiede. Dabei können Quelle und Ziel lokal oder entfernt sein. Der rsync-Befehl kann Datenübertragungen und -synchronisationen auf zwei Arten durchführen:

  • Übertragung und Synchronisation zwischen zwei Hosts mittels SSH oder rsh.
  • Verwendung des TCP-rsync-Daemons für die Synchronisation.

Da rsync ursprünglich für Unix-basierte Systeme entwickelt wurde, funktioniert es auch reibungslos unter Linux.

Der detaillierte Prozess von rsync umfasst folgende Schritte:

  • rsync stellt über SSH eine Verbindung zum entfernten Host her und fordert gegebenenfalls ein Passwort an.
  • Nach erfolgreicher Verbindung kommuniziert der rsync-Prozess auf dem Remote-Host mit der Quelle.
  • Die beteiligten Programme analysieren die zu synchronisierenden Dateien und Verzeichnisse. Dabei verwendet rsync den Delta-Übertragungsalgorithmus, um die Unterschiede zwischen den Dateien zu identifizieren.

Wenn rsync eine Datei auf dem entfernten System findet, die auf dem lokalen Host nicht vorhanden ist, wird diese auf das Hostsystem kopiert. Existieren Dateien auf beiden Systemen, werden lediglich die Unterschiede übertragen. Unveränderte Dateien werden von rsync ignoriert.

rsync erreicht inkrementelle Updates, indem es die Änderungen in einer temporären Datei speichert, bevor sie auf das Zielsystem übertragen werden.

Vor dem Beginn sollten folgende Voraussetzungen erfüllt sein:

  • Sie benötigen Root- oder Sudo-Rechte.
  • Ein Zugriff auf das Terminal oder die Kommandozeile muss möglich sein.
  • SSH-Zugriff ist für die sichere Ausführung von rsync-Befehlen erforderlich.
  • Es werden zwei Maschinen benötigt, um die rsync-Funktionalität zu testen.

Für diese Anleitung verwenden wir Linux Mint 21.1 Vera. Die gezeigten Schritte können aber auch mit anderen Linux-Distributionen problemlos nachvollzogen werden.

Warum rsync anstelle von SCP verwenden?

Scp (Secure Copy) ist ein weit verbreitetes Kommandozeilenprotokoll für das Kopieren von Dateien, das einen linearen Kopieransatz verfolgt. Das heißt, Dateien werden einfach von der Quelle zum Ziel kopiert, wobei zur Sicherheit SSH genutzt wird.

Die Syntax für scp lautet wie folgt:

scp option QUELLE ZIEL

Warum sollte man rsync gegenüber scp bevorzugen?

Die Verwendung von rsync bietet einige entscheidende Vorteile:

  • Schnellere Ausführung: rsync ist aufgrund seines Remote-Update-Protokolls schneller als scp. Es werden lediglich die Unterschiede und nicht die vollständigen Dateien übertragen. Nach der ersten vollständigen Kopie werden bei regelmäßigen Synchronisationen nur die veränderten Teile mittels des Delta-Transfer-Algorithmus kopiert.
  • Geringerer Bandbreitenverbrauch: Da rsync nicht jedes Mal die ganze Datei kopieren muss, wird die Bandbreite geschont. Zusätzlich werden Daten durch Kompressions- und Dekompressionsalgorithmen bei der Übertragung verkleinert.
  • Mehr Kommandozeilenoptionen: rsync bietet mehr Kommandozeilenoptionen als scp, wodurch eine präzisere Steuerung des Synchronisationsprozesses möglich ist.

Zusammenfassend lässt sich sagen, dass rsync ein überlegenes Tool für inkrementelle Synchronisationen ist, während scp für die einfache und sichere Übertragung von Dateien geeignet ist. Für wiederkehrende Aufgaben ist rsync die bessere Wahl, während scp für alltägliche Aufgaben praktikabel ist.

rsync-Befehlssyntax im Überblick

Die Grundsyntax des rsync-Befehls ist wie folgt:

rsync OPTION QUELLE ZIEL

Dabei bedeuten die Begriffe Folgendes:

  • OPTION: Zusätzliche rsync-Optionen und Parameter.
  • QUELLE: Das Quellverzeichnis.
  • ZIEL: Das Zielverzeichnis.
  • USER: Der Benutzername auf dem entfernten System.
  • HOST: Der Hostname oder die IP-Adresse des entfernten Systems.

Die Optionen sind Parameter, die dem Befehl zusätzliche Funktionalitäten verleihen. So synchronisiert die Option -r Daten rekursiv, aber sie überträgt nicht die Eigentumsrechte, Zeitstempel, Berechtigungen oder symbolischen Links. Für die Erhaltung dieser Eigenschaften beim Kopieren kann man die Option -a verwenden, die den Befehl im Archivmodus ausführt.

Weitere nützliche rsync-Optionen sind:

  • -z: Komprimiert die Daten zur Platzersparnis.
  • -h: Gibt eine menschenlesbare Formatierung der Ausgabe.
  • -b: Erstellt eine Sicherung während des Synchronisationsprozesses.
  • -e: Verwendet das SSH-Protokoll für Remote-Datenübertragungen.
  • --progress: Zeigt den Fortschritt der Datensynchronisation.
  • -v: Erzwingt eine detaillierte Ausgabe des rsync-Befehls.
  • -n: Führt einen Probelauf aus, um Einstellungen zu testen, ohne die Daten zu synchronisieren.
  • -q: Unterdrückt die Ausgabe des rsync-Befehls.

rsync installieren

Auf den meisten Unix- und Linux-Systemen ist rsync bereits installiert. Sollte dies nicht der Fall sein, kann es wie folgt installiert werden:

Für Debian/Ubuntu und Mint:

sudo apt-get install rsync

Für Arch-Linux:

pacman -S rsync

Für Gentoo:

emerge sys-apps/rsync

Für CentOS/Fedora/REHL:

sudo yum install rsync

Für openSUSE:

sudo zypper install rsync

Da wir Linux Mint verwenden, war rsync bereits vorinstalliert. Man kann dies überprüfen, indem man den Befehl rsync im Terminal eingibt. Dadurch werden die Funktionen, Optionen und andere relevante Informationen des Programms angezeigt.

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.

Nach dieser Vorbereitung wollen wir uns nun ansehen, wie rsync in verschiedenen Anwendungsfällen funktioniert.

Für das nachfolgende Tutorial erstellen wir zwei Verzeichnisse:

  • Quellverzeichnis
  • Zielverzeichnis

Dies geschieht mit folgenden Befehlen:

mkdir source-directory
mkdir dest-directory

Um rsync zu testen, benötigen wir auch Testdateien. Diese erstellen wir wie folgt:

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

Dadurch werden 100 leere Dateien im Quellverzeichnis erzeugt. Dies können wir mit dem Befehl ls source-directory überprüfen:

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

Das Zielverzeichnis haben wir bewusst leer gelassen.

Lokales rekursives Kopieren von Verzeichnissen

rsync wird oft zur Übertragung zwischen lokalen und entfernten Servern genutzt, ist aber auch für lokale Kopiervorgänge sehr nützlich.

Die grundlegende rsync-Syntax lautet in diesem Fall:

rsync OPTION QUELLE ZIEL

Um alle Dateien aus dem Quellverzeichnis in das Zielverzeichnis zu kopieren, geben wir folgenden Befehl ein:

rsync -r source-directory/ dest-directory

Dieser Befehl kopiert alle Dateien rekursiv vom Quell- in das Zielverzeichnis:

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

Dadurch werden alle Dateien aus dem Quellverzeichnis in das Zielverzeichnis kopiert.

Lokales Kopieren einer einzelnen Datei

Nachdem wir gelernt haben, wie man ganze Verzeichnisse synchronisiert, betrachten wir nun das Kopieren einzelner Dateien.

Dazu bearbeiten wir die Datei file1 im Quellverzeichnis und synchronisieren diese mit der gleichnamigen Datei im Zielverzeichnis.

Zum Bearbeiten der Datei verwenden wir folgenden Befehl:

nano source-directory/file1

Kopieren Sie den folgenden Text in den 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.

Schließen und speichern Sie die Datei.

Jetzt kopieren wir die Datei mit 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
$

Wie Sie bemerkt haben, haben wir die Option --existing verwendet. Diese Option aktualisiert nur bestehende Dateien. Ohne diese Option wird die Datei nicht aktualisiert.

Sollte die zu kopierende Datei im Zielverzeichnis nicht existieren, verwenden Sie folgenden Befehl:

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

Kopieren von mehreren Dateien

Sollen mehrere Dateien kopiert werden, müssen die Quellpfade der einzelnen Dateien angegeben werden, gefolgt vom Zielverzeichnis.

Dazu erstellen wir zwei neue Dateien im Quellverzeichnis: newfile2 und newfile3:

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

Mit diesem Befehl werden die Dateien synchronisiert:

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
$

Kopieren von lokalen zu entfernten Systemen

Die Syntax für rsync-Übertragungen von lokal zu entfernt lautet:

rsync OPTION QUELLE [email protected]:ZIEL

Dafür benötigen Sie die IP-Adresse des Remote-Computers, die nach der Quelldatei angegeben wird.

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

Vor Beginn der Übertragung werden Sie nach einem Passwort gefragt. Wenn sich der Benutzer auf dem Remote-Computer unterscheidet, muss der Benutzername vor der IP-Adresse gefolgt von @ angegeben werden:

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

Um mehrere Dateien oder Verzeichnisse zu kopieren, müssen deren Pfade aufgelistet werden:

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

Spezifische Protokolle für die Fernübertragung

rsync ermöglicht die Angabe bestimmter Dateiübertragungsprotokolle. Dazu wird die Option -e gefolgt vom Protokoll verwendet.

Für die Verwendung des SSH-Protokolls hängen wir -e ssh an den rsync-Befehl an:

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

Kopieren von entfernten zu lokalen Systemen

Die Syntax für rsync-Übertragungen von Remote zu Lokal lautet wie folgt:

rsync OPTION [email protected]:QUELLE ZIEL

Um die erforderlichen Dateien oder Verzeichnisse von einem Remote-Server auf den lokalen Computer zu ziehen, wird folgender Befehl verwendet:

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

Der Befehl kopiert die Dateien aus dem Zielverzeichnis des Remote-Computers in das Quellverzeichnis des lokalen Computers.

Eine bestimmte Datei kann durch Angabe ihres vollständigen Pfades kopiert werden:

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

Zum Kopieren mehrerer Dateien oder Verzeichnisse wird der Pfad innerhalb geschweifter Klammern nach der Server-IP-Adresse angegeben:

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

Dateien lassen sich ebenso auf diese Art erwähnen.

Live-Fortschritt der Übertragung anzeigen

Bei größeren Datensicherungen ist es hilfreich, den Fortschritt live zu sehen. Dazu dient der Parameter --progress, der die Übertragungsgeschwindigkeit, die verbleibende Zeit und die übertragene Datenmenge anzeigt:

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

Löschen von Quelldateien nach der Übertragung

Nach erfolgreicher Übertragung können die Quelldateien mit der Option --remove-source-files gelöscht werden. Dies kann nützlich sein, um Speicherplatz freizugeben oder Ihre Dateien spurlos zu sichern:

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

rsync Probelauf

Mit rsync kann man Übertragungen zunächst in einem Probelauf testen. Dies hilft, Fehler beim Synchronisieren oder Löschen von Dateien zu vermeiden.

Für einen Probelauf wird die Option --dry-run verwendet:

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

Die Ausgabe ist ähnlich wie bei einer echten Übertragung, jedoch wird am Ende die Angabe (DRY RUN) hinzugefügt.

Festlegen von minimaler und maximaler Dateigröße

Mit rsync können Sie die minimale oder maximale Dateigröße für die Übertragung festlegen. Für eine Mindestgröße von 15 KB wird --min-size=15k verwendet:

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

Der Befehl kopiert nur Dateien mit einer Größe von mindestens 15 KB. Dateien mit geringerer Größe werden ignoriert. Analog kann die maximale Dateigröße mit der Option --max-size festgelegt werden:

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

Hier ignoriert rsync Dateien, die größer als 450 KB sind.

Festlegen einer Bandbreitenbegrenzung

Wenn andere Aufgaben mit hoher Bandbreitennutzung ausgeführt werden, können Sie die Bandbreite für rsync begrenzen. Dazu dient --bwlimit=KB/s:

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

Hier wird die Bandbreite während der Übertragung auf 100 Kb/s begrenzt.

Abschließende Worte

Dies beendet unseren rsync-Befehlsleitfaden. Wir haben gelernt, wie man rsync verwendet und eine Vielzahl von Befehlen effektiv handhabt.

rsync bietet jedoch noch viel mehr Funktionen als hier behandelt. Daher lohnt es sich, die rsync-Manpage zu konsultieren, in der jeder Aspekt des Programms detailliert beschrieben ist.

Werfen Sie als Nächstes einen Blick auf Befehlszeilen-Spickzettel für Windows, Linux und macOS.