🧰Optionen, Baukasten und Rückgabecodes
rsync hat über 150 Optionen – im Alltag braucht man etwa 25. Klick dir einen Befehl zusammen und sieh für jeden Teil, was er bewirkt. Warnungen erscheinen, sobald eine Kombination gefährlich oder sinnlos ist.
🧱Befehls-Baukasten
--delete ohne -n: erst einen Probelauf mit -n -i (bzw. -nv) machen und die „deleting“-Zeilen prüfen.Was jeder Teil bedeutet
-az-a (--archive) – Kurz für-rlptgoD: rekursiv, Symlinks als Symlinks, Rechte, Zeiten, Gruppe, Besitzer, Geräte-/Spezialdateien. Nicht enthalten: Hardlinks (-H), ACLs (-A), xattrs (-X).-z (--compress) – Daten während der Übertragung komprimieren (rsync ≥ 3.2 handelt z. B. zstd aus). Lohnt nur über langsame Netze, nicht lokal.--delete--delete – Dateien beim Ziel löschen, die es in der Quelle nicht (mehr) gibt – macht aus der Kopie einen Spiegel. Ausgeschlossene Dateien bleiben geschützt.--exclude=node_modules--exclude – Entspricht der Filterregel- MUSTER. Die erste passende Regel gewinnt – Reihenfolge beachten.--exclude=.git/--exclude – Entspricht der Filterregel- MUSTER. Die erste passende Regel gewinnt – Reihenfolge beachten.--exclude='.env*'--exclude – Entspricht der Filterregel- MUSTER. Die erste passende Regel gewinnt – Reihenfolge beachten../Quelle mit Slash: nur der Inhalt wird kopiert.deploy@web.example.org:/var/www/site/Entfernt über SSH: Host „web.example.org“, Benutzer „deploy“, Pfad „/var/www/site/“.
➗Der berühmte Slash am Quellpfad
/srv/www/projekt.css/style.css als /projekt/css/style.css – eine verankerte Regel muss also mit /projekt/ beginnen.Am Ziel ist der Slash bei Verzeichnissen egal. Nur beim Kopieren einer einzelnen Datei zählt er: rsync a.txt b.txt legt die Datei als b.txt an, rsync a.txt b/ legt b/a.txt an.
🅰️Was -a wirklich bedeutet
-H (Hardlinks), -A (ACLs), -X (xattrs),-U (Zugriffszeiten), -N (Erstellzeiten). Für ein vollständiges System-Backup also rsync -aHAX --numeric-ids.📖Die wichtigsten Optionen
-a--archiveGrundlagenKurz für -rlptgoD: rekursiv, Symlinks als Symlinks, Rechte, Zeiten, Gruppe, Besitzer, Geräte-/Spezialdateien. Nicht enthalten: Hardlinks (-H), ACLs (-A), xattrs (-X).
-r--recursiveGrundlagenVerzeichnisse mit allen Unterverzeichnissen kopieren.
-l--linksErhaltenSymbolische Links als Links kopieren (nicht das Ziel des Links).
-p--permsErhaltenZugriffsrechte (rwx) des Senders beim Empfänger setzen.
-t--timesErhaltenmtime übernehmen. Ohne -t kann der Quick-Check beim nächsten Lauf nicht greifen – dann wird jede Datei erneut geprüft.
-g--groupErhaltenGruppenzugehörigkeit übernehmen (soweit erlaubt).
-o--ownerErhaltenBesitzer übernehmen – wirkt nur, wenn der Empfänger als root läuft.
-D--devices --specialsErhaltenKurz für --devices --specials: Gerätedateien, FIFOs und Sockets übertragen.
-H--hard-linksErhaltenHardlinks innerhalb der Quelle erkennen und beim Ziel wieder als Hardlinks anlegen. Kostet Speicher bei vielen Dateien.
-A--aclsErhaltenPOSIX-ACLs übernehmen (impliziert -p).
-X--xattrsErhaltenExtended Attributes (xattrs) übernehmen, z. B. SELinux-Kontexte oder Datei-Metadaten.
--numeric-idsErhaltenUID/GID als Zahlen übertragen statt über Benutzernamen abzubilden – wichtig für Server-Backups und Wiederherstellung.
-v--verboseAusgabeÜbertragene Dateien und eine Zusammenfassung anzeigen.
-h--human-readableAusgabeGrößen mit Einheiten (K, M, G) ausgeben.
-i--itemize-changesAusgabePro Datei einen Code wie >f.st...... ausgeben: was sich ändert (Größe s, Zeit t, Rechte p …).
-P--partial --progressAusgabeKurz für --partial --progress: Fortschrittsanzeige je Datei und abgebrochene Dateien behalten, damit ein neuer Lauf weitermachen kann.
--progressAusgabeFortschritt je Datei anzeigen.
--info=progress2AusgabeFortschritt über den ganzen Transfer statt je Datei (gut zusammen ohne -v).
--statsAusgabeAm Ende Statistik ausgeben: u. a. „Literal data“ (gesendete Bytes) und „Matched data“ (vom Ziel wiederverwendete Bytes).
-n--dry-runGrundlagenNichts verändern, nur anzeigen, was passieren würde. Zusammen mit -v oder -i vor jedem --delete Pflicht.
-c--checksumVergleichStatt Quick-Check (Größe + mtime) für jede gleich große Datei eine Prüfsumme auf beiden Seiten berechnen. Sehr gründlich, aber liest alle Daten – langsam.
-u--updateVergleichDateien überspringen, die beim Ziel neuer sind als in der Quelle.
--size-onlyVergleichQuick-Check nur über die Größe, Zeitstempel ignorieren (z. B. nach einem Umzug ohne erhaltene Zeiten).
--modify-window=SEKVergleichZeitstempel gelten als gleich, wenn sie höchstens so viele Sekunden abweichen. 1 für FAT-Dateisysteme (2-Sekunden-Auflösung).
-W--whole-fileÜbertragungDelta-Algorithmus abschalten und geänderte Dateien komplett senden. Standard bei lokalen Kopien; schneller, wenn das Netz schneller ist als die Platte.
--deleteLöschenDateien beim Ziel löschen, die es in der Quelle nicht (mehr) gibt – macht aus der Kopie einen Spiegel. Ausgeschlossene Dateien bleiben geschützt.
--delete-excludedLöschenImpliziert --delete und löscht beim Ziel zusätzlich alles, was durch Filter ausgeschlossen ist (Regeln wirken dann nur noch beim Sender).
--max-delete=NLöschenHöchstens N Dateien/Verzeichnisse löschen; danach Abbruch der Löschungen und Rückgabecode 25.
--exclude=MUSTERFilterEntspricht der Filterregel - MUSTER. Die erste passende Regel gewinnt – Reihenfolge beachten.
--include=MUSTERFilterEntspricht + MUSTER; muss vor dem Exclude stehen, das es aufheben soll.
--filter=REGELFilterVollständige Regel, z. B. - *.tmp, + */, P geschützt.txt oder . regeln.txt (Merge-Datei). Kurzform -f.
--exclude-from=DATEIFilterMuster zeilenweise aus einer Datei lesen.
-C--cvs-excludeFilterTypische Build-/VCS-Dateien auslassen (*.o, .git/, core …) – Regeln sind „perishable“.
-b--backupBackupDateien, die überschrieben oder gelöscht würden, vorher umbenennen (Endung ~).
--backup-dir=DIRBackupImpliziert -b: ersetzte/gelöschte Dateien in dieses Verzeichnis verschieben (relativ zum Ziel!).
--link-dest=DIRBackupUnveränderte Dateien nicht kopieren, sondern als Hardlink auf DIR anlegen. Jeder Snapshot wirkt vollständig, belegt aber nur Platz für Änderungen. Relative Pfade gelten ab dem Ziel.
-z--compressÜbertragungDaten während der Übertragung komprimieren (rsync ≥ 3.2 handelt z. B. zstd aus). Lohnt nur über langsame Netze, nicht lokal.
--partialÜbertragungBei Abbruch die halb übertragene Datei behalten, damit der nächste Lauf sie als Basis nutzt.
--bwlimit=RATEÜbertragungMaximale Rate; ohne Einheit in KiB/s (5000 = 5000 KiB/s), mit Suffix z. B. 5m = 5 MiB/s.
-e--rsh=BEFEHLÜbertragungTransport wählen, z. B. SSH auf anderem Port oder mit Schlüsseldatei: -e "ssh -i ~/.ssh/backup_ed25519".
-x--one-file-systemÜbertragungKeine Grenzen von Dateisystemen überschreiten (z. B. /proc, eingehängte Laufwerke bei /-Backups).
--inplaceÜbertragungZieldatei direkt überschreiben statt Temp-Datei + Umbenennen. Spart Platz bei riesigen Dateien, aber bei Abbruch ist die Datei inkonsistent.
🔣--itemize-changes lesen
- Y = < wird zur Gegenseite gesendet
- X = f Datei
- s Größe anders
- t Änderungszeit anders (T = wird auf Übertragungszeit gesetzt)
🚦Rückgabecodes
| 0 | Erfolg |
| 1 | Syntax- oder Bedienfehler |
| 2 | Protokoll-Inkompatibilität |
| 3 | Fehler bei der Auswahl von Ein-/Ausgabedateien oder -verzeichnissen |
| 4 | Aktion nicht unterstützt (z. B. Option nur beim Client bekannt, nicht beim Server) |
| 5 | Fehler beim Start des Client-Server-Protokolls |
| 10 | Fehler bei Socket-Ein-/Ausgabe |
| 11 | Fehler bei Datei-Ein-/Ausgabe |
| 12 | Fehler im rsync-Protokoll-Datenstrom (oft: Gegenseite abgebrochen, rsync fehlt dort) |
| 13 | Fehler bei der Programmdiagnose |
| 14 | Fehler im IPC-Code |
| 15 | Geschwisterprozess abgestürzt (z. B. Core-Dump) |
| 16 | Geschwisterprozess durch ein Signal beendet |
| 19 | SIGUSR1 empfangen |
| 20 | SIGINT, SIGTERM oder SIGHUP empfangen (z. B. Strg+C) |
| 21 | Fehler von waitpid() |
| 22 | Speicher für Puffer konnte nicht reserviert werden |
| 23 | Teilweise übertragen wegen Fehlern (z. B. fehlende Rechte bei einzelnen Dateien) |
| 24 | Teilweise übertragen, weil Quelldateien verschwunden sind (typisch bei laufenden Systemen) |
| 25 | --max-delete-Grenze hat Löschungen gestoppt |
| 30 | Zeitüberschreitung beim Senden/Empfangen |
| 35 | Zeitüberschreitung beim Warten auf die Daemon-Verbindung |
Quelle: man rsync, Abschnitt „EXIT VALUES“ (rsync 3.4/3.5).