Wenn rsync eine einzige Stolperfalle hat, dann diese. Ein Zeichen — ein Trailing / — ändert, was kopiert wird. Kombinier das mit --delete, und du kannst dein Zielverzeichnis komplett leeren.
Ich habe das zweimal in Produktion erlebt. Beide Male wusste der Admin genau, was Trailing Slashes bewirken — er hatte nur vergessen, welche Konvention sein letztes Skript verwendet hat.
Ohne Trailing Slash — kopiert das Verzeichnis selbst:
rsync -av /srv/data /backup/
# Ergebnis: /backup/data/file1.txt, /backup/data/file2.txt
Mit Trailing Slash — kopiert den Inhalt:
rsync -av /srv/data/ /backup/
# Ergebnis: /backup/file1.txt, /backup/file2.txt
Beides ist in Ordnung. Die Gefahr entsteht beim Wechseln, ohne es zu merken.
Angenommen, dein Backup hat bereits Dateien von einem früheren Durchlauf mit der Variante ohne Slash:
/backup/data/file1.txt
/backup/data/file2.txt
Jetzt führst du die Variante mit Slash plus --delete aus:
rsync -av --delete /srv/data/ /backup/
Datenverlust
rsync sieht /backup/data/ als ein “zusätzliches” Verzeichnis, das im Quellinhalt nicht existiert. Mit --delete entfernt es den gesamten /backup/data/-Baum — dein vorheriges Backup ist weg.
--delete. Führe zuerst rsync -avn --delete /srv/data/ /backup/ aus. Keine Ausnahmen. Mach es dir zur Gewohnheit.--backup-dir als Sicherheitsnetz. Mit --backup-dir=/backup/.rsync-deleted/ wird alles gesichert, was --delete entfernen würde, sodass du dich von Fehlern erholen kannst..bashrc hinzu, damit Dry-Run der Standard ist:alias rsyncd='rsync -avn --delete'
# Nutzung: rsyncd /srv/data/ /backup/ (zeigt, was passieren WÜRDE)
Tip
Wenn du --delete ohne --dry-run verwendest, wirst du irgendwann Daten verlieren. Nicht ob. Wann.
Für 30 weitere rsync-Befehle nach Anwendungsfall sortiert, siehe den kompletten rsync-Guide. Und wenn Trailing Slashes genau die Art von Stolperfalle sind, die dich nach einer GUI rufen lassen, handhaben rclone und Robocopy die Quell-/Ziel-Unterscheidung anders.