Der Befehl zum Einstieg
rsync -avz src/ user@server:/srv/app/
-akopiert Ordner und behält Rechte, Zeiten und Links bei.-vlistet die übertragenen Dateien auf.-zkomprimiert während der Übertragung. Das hilft bei Text auf einer langsamen Leitung und bringt bei bereits komprimierten Dateien wenig.
Führen Sie den Befehl zweimal hintereinander aus, und der zweite Lauf listet keine Dateien. Ändern Sie eine Datei, und er listet nur diese.
Welches der drei Werkzeuge passt, zeigt scp, SFTP oder rsync im Vergleich.
Der abschließende Slash
Ein Slash am Ende der Quelle verändert das Ergebnis. Bei einem Ordner namens site:
| Befehl | Ergebnis auf dem Server |
|---|---|
rsync -a site server:www/ | www/site/index.html |
rsync -a site/ server:www/ | www/index.html |
Ein Slash am Ende des Ziels macht dabei keinen Unterschied.
Eigener Port oder Schlüssel
rsync -avz -e "ssh -p 2222" src/ user@server:/srv/app/
rsync -avz -e "ssh -i ~/.ssh/id_work" src/ user@server:/srv/app/
Ein Host-Eintrag in Ihrer SSH-Konfiguration funktioniert ebenfalls und ist kürzer: rsync -avz src/ server:/srv/app/.
Große Dateien: Fortschritt und Fortsetzen
rsync -aP big.bin user@server:/tmp/
-P bedeutet --partial --progress. Ohne --partial entfernt rsync eine Datei, die es nicht fertig übertragen hat. Mit der Option bleibt die Teildatei erhalten, und der nächste Lauf nutzt sie. Wir haben eine Übertragung von 30 MB mittendrin gestoppt. Ohne --partial blieb keine Datei auf dem Server. Mit der Option blieben etwa 4 MB übrig, dasselbe rsync -aP beendete die Aufgabe, und die Prüfsummen beider Kopien stimmten überein.
--dry-run und --delete
--delete entfernt Dateien im Ziel, die in der Quelle nicht vorhanden sind. Sehen Sie sich das immer vorher mit --dry-run oder -n an:
$ rsync -avn --delete site/ server:www2/
sending incremental file list
deleting oldfile
...
total size is 9 speedup is 0.05 (DRY RUN)
Die Datei ist danach weiterhin da. Entfernen Sie -n, um es wirklich auszuführen.
Drei Arten, wie --delete schadet
- Eine leere Quelle leert das Ziel. Ein Probelauf mit einem leeren Ordner
empty/als Quelle wollte alles im Ziel löschen. Ist ein Mount fehlgeschlagen und der Quellordner leer, passiert genau das. - Ein falscher Slash löscht mehr als gewollt. Das Ziel wird mit der Quelle so verglichen, wie Sie sie geschrieben haben. Bei
sitegegenwww/wird also alles andere inwww/gelöscht. - Ausschlüsse wirken zusammen. Ausgeschlossene Dateien bleiben unberührt, außer Sie fügen
--delete-excludedhinzu. In unserem Test entfernte dasdebug.logvom Server.
Ein Limit stoppt einen Lauf, der zu viel löschen würde. Er endet mit Code 25:
$ rsync -a --delete --max-delete=1 empty/ server:www2/
Deletions stopped due to --max-delete limit (2 skipped)
Weitere nützliche Formen
| Aufgabe | Befehl |
|---|---|
| Herunterladen | rsync -av server:www/ back/ |
| Dateien überspringen | rsync -av --exclude='*.log' site/ server:www/ |
| Sehen, was sich ändern würde und warum | rsync -ain site/ server:www/ |
| Fehlende Ordner im Ziel anlegen | rsync -a --mkpath site/ server:a/b/c/ |
Ohne --mkpath scheitert ein Ziel, das mehr als einen Ordner tief liegt, mit mkdir ... failed: No such file or directory.
Fehler
Ist rsync auf dem Server nicht installiert, erhalten Sie Meldungen wie diese, und die Lösung ist, es dort zu installieren:
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: remote command not found (code 127)
Ein Quellordner, der nicht existiert, ergibt change_dir ... failed: No such file or directory und den Exit-Code 23.
Auf einem Mac
rsync auf dem von uns genutzten Mac ist openrsync und meldet rsync version 2.6.9 compatible. Es kam mit den oben genannten Grundoptionen zurecht, aber seine Hilfe kennt weder --mkpath noch --append-verify. Brauchen Sie diese, installieren Sie mit Homebrew ein neueres rsync.
Fragen
Braucht rsync über SSH rsync auf dem Server?
Ja. rsync läuft auf beiden Seiten. Fehlt es auf dem Server, erhalten Sie remote command not found (code 127).
Wie nutze ich rsync mit einem anderen SSH-Port?
Übergeben Sie den ssh-Befehl mit -e, zum Beispiel rsync -avz -e "ssh -p 2222" src/ user@server:/srv/app/, oder setzen Sie den Port in einem Host-Eintrag in ~/.ssh/config.
Was bedeutet der Schrägstrich am Ende bei rsync?
Bei der Quelle kopiert src/ den Inhalt des Ordners und src den Ordner selbst. Beim Ziel macht er keinen Unterschied.