rsync: Unterschied zwischen --size-only und --ignore-times

114

Ich versuche zu verstehen, was der Unterschied zwischen zwei Optionen ist

rsync --size-only

und

rsync --ignore-times

Nach meinem Verständnis vergleicht rsync standardmäßig sowohl die Zeitstempel als auch die Dateigrößen, um zu entscheiden, ob eine Datei synchronisiert werden soll oder nicht. Mit den oben genannten Optionen kann der Benutzer dieses Verhalten beeinflussen.

Beide Optionen scheinen zumindest verbal dasselbe zu ergeben: nur nach Größe zu vergleichen .

Vermisse ich hier etwas Feines?

alfred_j_kwack
quelle
18
Dies würde wahrscheinlich besser zu etwas wie SuperUser.com oder Unix.SE passen , da es darum geht, ein vorhandenes (nicht programmierbezogenes) Tool zu verwenden, anstatt irgendetwas, das direkt mit dem Schreiben von Code zusammenhängt.
Jerry Coffin

Antworten:

110

Es gibt verschiedene Möglichkeiten, wie rsync Dateien vergleicht - die maßgebliche Quelle ist die Beschreibung des rsync-Algorithmus: https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf . Der Wikipedia-Artikel über rsync ist auch sehr gut.

Bei lokalen Dateien vergleicht rsync Metadaten. Wenn es so aussieht, als müsste die Datei nicht kopiert werden, da Größe und Zeitstempel zwischen Quelle und Ziel übereinstimmen, wird nicht weiter gesucht. Wenn sie nicht übereinstimmen, ist es die Datei. Was ist jedoch, wenn die Metadaten übereinstimmen, die Dateien jedoch nicht identisch sind? Dann hat rsync wahrscheinlich nicht das getan, was Sie beabsichtigt haben.

Dateien mit derselben Größe haben sich möglicherweise noch geändert. Ein einfaches Beispiel ist eine Textdatei, in der Sie einen Tippfehler korrigieren - wie das Ändern von "teh" in "the". Die Dateigröße ist gleich, aber die korrigierte Datei hat einen neueren Zeitstempel. --size-onlysagt "Schau nicht auf die Zeit; wenn die Größe übereinstimmt, gehe davon aus, dass die Dateien übereinstimmen", was in diesem Fall die falsche Wahl wäre.

Nehmen wir andererseits an, Sie haben cp -r A Bgestern versehentlich einen großen Fehler gemacht, aber Sie haben vergessen, die Zeitstempel beizubehalten, und jetzt möchten Sie den Vorgang in umgekehrter Reihenfolge ausführen rsync B A. Alle Dateien, die Sie erstellt haben, haben den gestrigen Zeitstempel, obwohl sie gestern nicht wirklich geändert wurden, und rsync kopiert standardmäßig alle diese Dateien und aktualisiert den Zeitstempel auch auf gestern. --size-onlykann in diesem Fall dein Freund sein (modulo das obige Beispiel).

--ignore-timessagt, die Dateien zu vergleichen, unabhängig davon, ob die Dateien die gleiche Änderungszeit haben. Betrachten Sie das obige Tippfehlerbeispiel, aber Sie haben dann nicht nur den Tippfehler touchkorrigiert , sondern auch dafür gesorgt , dass die korrigierte Datei dieselbe Änderungszeit wie die Originaldatei hat. Nehmen wir einfach an, Sie sind auf diese Weise hinterhältig. Nun --ignore-timeswird ein Unterschied der Dateien gemacht , obwohl die Größe und Zeit übereinstimmen.

ckg
quelle
58

Die kurze Antwort lautet: Das --ignore-timesmacht mehr als der Name vermuten lässt. Es ignoriert sowohl die Zeit und Größe. Im Gegensatz dazu --size-onlymacht genau das, was es sagt.


Die lange Antwort lautet: Es rsyncgibt drei Möglichkeiten, um zu entscheiden, ob eine Datei veraltet ist:

  1. Vergleichen Sie die Größe von Quelle und Ziel.
  2. Vergleichen Sie den Zeitstempel von Quelle und Ziel.
  3. Vergleichen Sie die statische Prüfsumme von Quelle und Ziel.

Diese Überprüfungen werden vor der Datenübertragung durchgeführt. Dies bedeutet insbesondere, dass sich die statische Prüfsumme von der Stream-Prüfsumme unterscheidet - die letztere wird beim Übertragen von Daten berechnet.

rsyncVerwendet standardmäßig nur 1 und 2. Sowohl 1 als auch 2 können zusammen von einem einzelnen erfasst werden stat, während 3 das Lesen der gesamten Datei erfordert (dies ist unabhängig vom Lesen der Datei für die Übertragung). Angenommen, es wird nur ein Modifikator angegeben, bedeutet dies Folgendes:

  • Bei Verwendung --size-onlywird nur 1 ausgeführt - Zeitstempel und Prüfsumme werden ignoriert. Eine Datei wird kopiert, es sei denn, ihre Größe ist an beiden Enden identisch.

  • Bei Verwendung --ignore-timeswird weder 1, 2 noch 3 ausgeführt. Eine Datei wird immer kopiert.

  • Bei Verwendung --checksumwird 3 zusätzlich zu 1 verwendet, 2 wird jedoch nicht ausgeführt. Eine Datei wird kopiert, sofern Größe und Prüfsumme nicht übereinstimmen. Die Prüfsumme wird nur berechnet, wenn die Größe übereinstimmt.

MisterMiyagi
quelle
1
--checksum ist genau das, wonach ich gesucht habe. Ich habe eine Build-Ausgabe kopiert, bei der sich die Zeit nur für die meisten Dateien geändert hat. Das Hinzufügen von --checksum bedeutete, dass die Zeitunterschiede ignoriert wurden, aber sichergestellt wurde, dass sie Bit für Bit identisch waren. Es war das, was ich erwartet hatte - früher, danke für zusätzliche Informationen.
Joseph Connolly
50

Sie vermissen, dass rsync Dateien auch nach Prüfsumme vergleichen kann.

--size-onlybedeutet, dass rsync Dateien überspringt, deren Größe übereinstimmt, auch wenn sich die Zeitstempel unterscheiden. Dies bedeutet, dass weniger Dateien als im Standardverhalten synchronisiert werden. Es fehlen alle Dateien mit Änderungen, die sich nicht auf die Gesamtgröße der Datei auswirken. Wenn Sie etwas haben, das die Daten für Dateien ändert, ohne die Dateien zu ändern, und Sie nicht möchten, dass rsync viel Zeit damit verbringt, diese Dateien zu überprüfen, um festzustellen, dass sie sich nicht geändert haben, ist dies die zu verwendende Option.

--ignore-timesbedeutet, dass rsync jede Datei prüft, auch wenn die Zeitstempel und Dateigrößen übereinstimmen. Dies bedeutet, dass mehr Dateien als im Standardverhalten synchronisiert werden. Es enthält Änderungen an Dateien, auch wenn die Dateigröße gleich ist und das Änderungsdatum / die Änderungszeit auf den ursprünglichen Wert zurückgesetzt wurde. Wenn jede Datei überprüft wird, muss sie vollständig von der Festplatte gelesen werden, was möglicherweise langsam ist. Einige Build-Pipelines setzen Zeitstempel auf ein bestimmtes Datum zurück (z. B. 1970-01-01), um sicherzustellen, dass die endgültige Build-Datei Bit für Bit reproduzierbar ist, z. B. wenn sie in eine TAR-Datei gepackt wird, in der die Zeitstempel gespeichert werden.

rjmunro
quelle
4
"Das Zurücksetzen von Datum / Uhrzeit ist in der Praxis unwahrscheinlich, kann aber vorkommen" - Zum Beispiel bei Verwendung von Software, die im Namen reproduzierbarer Builds jede Datei zwangsweise auf 1970-01-01 anstelle von Datum und zurücksetzt Zeitpunkt der tatsächlichen Erstellung / Änderung.
10
Eigentlich denke ich, dass Sie die Option -c benötigen, wenn Prüfsummen verwendet werden sollen. Ohne diese Option kopiert --ignore-times alle Dateien bedingungslos.
Edward Falk
1
Die Option -a kann diese Optionen überschreiben. In meinem Fall habe ich --compare-dir = und --size-only verwendet und unerwartete Ergebnisse erzielt. Das Ändern von -a in -r löste das Problem.
Dbagnara
@dbagnara Ich habe heute bestätigt, dass --size-only "über" -a oder "overrides" -a steht. Ich hatte ein Laufwerk, das aus irgendeinem Grund mit allen Änderungszeiten um einen Monat verlängert wurde. Rsync to Backup kopierte jede Datei (mit -a ON). Das Hinzufügen von --size-only behebt das Problem und führt zu den gewünschten Ergebnissen (also -a --size-only). Ich komme zu dem Schluss, dass nur die Größe das Archiv überschreibt.
Tommy
1

Auf einem Scientific Linux 6.7-System heißt es in der Manpage zu rsync:

--ignore-times          don't skip files that match size and time

Ich habe zwei Dateien mit identischem Inhalt, aber unterschiedlichen Erstellungsdaten:

[root@windstorm ~]# ls -ls /tmp/master/usercron /tmp/new/usercron
4 -rwxrwx--- 1 root root 1595 Feb 15 03:45 /tmp/master/usercron
4 -rwxrwx--- 1 root root 1595 Feb 16 04:52 /tmp/new/usercron

[root@windstorm ~]# diff /tmp/master/usercron /tmp/new/usercron
[root@windstorm ~]# md5sum /tmp/master/usercron /tmp/new/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/master/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/new/usercron

Mit --size-onlywerden die beiden Dateien als gleich angesehen:

[root@windstorm ~]# rsync -v --size-only -n  /tmp/new/usercron /tmp/master/usercron

sent 29 bytes  received 12 bytes  82.00 bytes/sec
total size is 1595  speedup is 38.90 (DRY RUN)

Mit --ignore-timeswerden die beiden Dateien als unterschiedlich angesehen:

[root@windstorm ~]# rsync -v --ignore-times -n  /tmp/new/usercron /tmp/master/usercron
usercron

sent 32 bytes  received 15 bytes  94.00 bytes/sec
total size is 1595  speedup is 33.94 (DRY RUN)

Es sieht also so aus, als hätte es --ignore-timesüberhaupt keine Wirkung.

Peter Chiu
quelle
2
--ignore-timeshätte die Dateien kopiert, selbst wenn ihre Zeitstempel gleich wären.
MisterMiyagi