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?
Antworten:
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-only
sagt "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 B
gestern versehentlich einen großen Fehler gemacht, aber Sie haben vergessen, die Zeitstempel beizubehalten, und jetzt möchten Sie den Vorgang in umgekehrter Reihenfolge ausführenrsync 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-only
kann in diesem Fall dein Freund sein (modulo das obige Beispiel).--ignore-times
sagt, 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 Tippfehlertouch
korrigiert , 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-times
wird ein Unterschied der Dateien gemacht , obwohl die Größe und Zeit übereinstimmen.quelle
Die kurze Antwort lautet: Das
--ignore-times
macht mehr als der Name vermuten lässt. Es ignoriert sowohl die Zeit und Größe. Im Gegensatz dazu--size-only
macht genau das, was es sagt.Die lange Antwort lautet: Es
rsync
gibt drei Möglichkeiten, um zu entscheiden, ob eine Datei veraltet ist: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.
rsync
Verwendet standardmäßig nur 1 und 2. Sowohl 1 als auch 2 können zusammen von einem einzelnen erfasst werdenstat
, 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-only
wird 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-times
wird weder 1, 2 noch 3 ausgeführt. Eine Datei wird immer kopiert.Bei Verwendung
--checksum
wird 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.quelle
Sie vermissen, dass rsync Dateien auch nach Prüfsumme vergleichen kann.
--size-only
bedeutet, 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-times
bedeutet, 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.quelle
Auf einem Scientific Linux 6.7-System heißt es in der Manpage zu rsync:
Ich habe zwei Dateien mit identischem Inhalt, aber unterschiedlichen Erstellungsdaten:
Mit
--size-only
werden die beiden Dateien als gleich angesehen:Mit
--ignore-times
werden die beiden Dateien als unterschiedlich angesehen:Es sieht also so aus, als hätte es
--ignore-times
überhaupt keine Wirkung.quelle
--ignore-times
hätte die Dateien kopiert, selbst wenn ihre Zeitstempel gleich wären.