it-swarm.com.de

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

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 obigen Optionen kann der Benutzer dieses Verhalten beeinflussen.

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

Vermisse ich hier etwas Feines?

101
alfred_j_kwack

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 . Das Wikipedia-Artikel auf Rsync ist auch sehr gut.

Bei lokalen Dateien vergleicht rsync Metadaten, und 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 gleicher Größe haben sich möglicherweise noch geändert. Ein einfaches Beispiel ist eine Textdatei, in der Sie einen Tippfehler korrigieren und "the" in "the" ändern. Die Dateigröße ist gleich, aber die korrigierte Datei hat einen neueren Zeitstempel. --size-only sagt "schau nicht auf die Zeit; wenn Größenübereinstimmungen angenommen werden, stimmen die Dateien überein", was in diesem Fall die falsche Wahl wäre.

Angenommen, Sie haben gestern versehentlich ein großes "cp -r A B" durchgeführt, aber Sie haben vergessen, die Zeitstempel beizubehalten, und jetzt möchten Sie die Operation in umgekehrter Reihenfolge "rsync B A" ausführen. Alle diese Dateien, die Sie erstellt haben, haben den Zeitstempel von gestern, 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, dass die Dateien verglichen werden sollen, unabhängig davon, ob die Dateien dieselbe Änderungszeit haben. Betrachten Sie das obige Tippfehler-Beispiel, aber dann haben Sie nicht nur den Tippfehler korrigiert, sondern Sie haben "touch" verwendet, um sicherzustellen, dass die korrigierte Datei dieselbe Änderungszeit wie die Originaldatei hat - sagen wir einfach, dass Sie auf diese Weise hinterhältig sind. Nun, --ignore-times wird einen Unterschied zwischen den Dateien machen , obwohl Größe und Zeit übereinstimmen.

101
ckg

Sie vermissen, dass rsync Dateien auch anhand von Prüfsummen vergleichen kann.

--size-only bedeutet, dass rsync Dateien mit gleicher Größe überspringt, auch wenn die Zeitstempel unterschiedlich sind. Dies bedeutet, dass weniger Dateien synchronisiert werden als beim Standardverhalten. Es werden keine Dateien mit Änderungen ausgelassen, die sich nicht auf die Gesamtgröße der Dateien auswirken. Wenn Sie Daten in Dateien ändern möchten, ohne die Dateien zu ändern, und Sie möchten nicht, dass rsync viel Zeit damit verbringt, diese Dateien zu überprüfen, um festzustellen, ob sie sich nicht geändert haben, können Sie diese Option verwenden.

--ignore-times bedeutet, dass rsync jede Datei prüft, auch wenn Zeitstempel und Dateigröße übereinstimmen. Dies bedeutet, dass mehr Dateien synchronisiert werden als im Standardverhalten. Es enthält Änderungen an Dateien, auch wenn die Dateigröße gleich ist und das Änderungsdatum und die Änderungszeit auf den ursprünglichen Wert zurückgesetzt wurden. Wenn Sie jede Datei mit einer Prüfsumme versehen, muss sie vollständig von der Festplatte gelesen werden. Dies kann sehr langsam sein. 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. wenn in eine tar-Datei gepackt, die die Zeitstempel speichert.

46
rjmunro

Die kurze Antwort ist, dass --ignore-times macht mehr als der Name vermuten lässt. Es ignoriert beide die Zeit und Größe. Im Gegensatz, --size-only macht genau das, was es sagt.


Die lange Antwort lautet, dass rsync drei Möglichkeiten hat, 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 Prü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 während der Datenübertragung berechnet.

Standardmäßig verwendet rsync nur 1 und 2. Sowohl 1 als auch 2 können zusammen von einem einzelnen stat erfasst werden, wohingegen 3 das Lesen der gesamten Datei erfordert (dies ist unabhängig vom Lesen der zu übertragenden Datei ). Wenn nur ein Modifikator angegeben wird, bedeutet dies Folgendes:

  • Durch die Nutzung --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.

  • Durch die Nutzung --ignore-times wird weder 1, 2 noch 3 ausgeführt. Eine Datei wird immer kopiert.

  • Durch die Nutzung --checksum, 3 wird in Addition zu 1 verwendet, aber 2 wird 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.

38
MisterMiyagi

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:

[[email protected] ~]# 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

[[email protected] ~]# diff /tmp/master/usercron /tmp/new/usercron
[[email protected] ~]# md5sum /tmp/master/usercron /tmp/new/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/master/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/new/usercron

Mit --size-only, die beiden Dateien werden als gleich angesehen:

[[email protected] ~]# 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-times, die beiden Dateien werden als unterschiedlich angesehen:

[[email protected] ~]# 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 nicht aus wie --ignore-times hat überhaupt keine Wirkung.

1
Peter Chiu