Warum versucht rsync, bereits aktualisierte Dateien zu kopieren?

24

Ich habe zwei gleiche Dateien, auf dem lokalen Computer und auf dem Remote-Computer. Ihre Größe ist gleich, und die Datei auf dem lokalen Computer ist neuer als auf dem Remote-Computer - rsync versucht jedoch weiterhin, die Datei zu kopieren.

Ich rufe rsync folgendermaßen auf:

rsync -nv -e "ssh -p 2222" user@host:/data/file.fif data/file.fif

(Wenn ich die -nOption nicht verwende , wird der Kopiervorgang gestartet.)

Rsync-Dokumente weisen ausdrücklich darauf hin, dass dies nicht passieren sollte:

Rsync  finds files that need to be transferred using a "quick check" algorithm (by default) that looks for files that have changed in size or in last-modified time.

Ausgaben von stat:

# remote file
  File: `data/fif/Skovorodko_Olga_45_raw.fif'
  Size: 1137551966  Blocks: 2221784    IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 286338      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1037/  platon)   Gid: ( 1047/  platon)
Access: 2013-08-08 18:40:16.907581658 +0400
Modify: 2013-07-16 12:01:09.158763284 +0400
Change: 2013-07-16 12:01:09.158763284 +0400

# local file
  File: `data/fif/Skovorodko_Olga_45_raw.fif'
  Size: 1137551966  Blocks: 2221792    IO Block: 4096   regular file
Device: 801h/2049d  Inode: 12987232    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1005/  platon)   Gid: ( 1003/  platon)
Access: 2013-08-08 19:02:57.146223369 +0400
Modify: 2013-08-08 19:02:57.146223369 +0400
Change: 2013-08-08 19:02:57.146223369 +0400

Warum passiert das?

AKTUALISIEREN:

Doing rsync --size-onlyErgebnisdatei wird nicht kopiert werden :

delta-transmission enabled
Skovorodko_Olga_45_raw.fif is uptodate
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 14 bytes  received 114 bytes  85.33 bytes/sec
total size is 1137551966  speedup is 8887124.73 (DRY RUN)
Rogach
quelle

Antworten:

37

Der Schnellprüfungsalgorithmus betrachtet jede Datei mit einer anderen Änderungszeit oder Größe als geändert. Wenn in Ihrem Zielverzeichnis eine neuere Version derselben Datei vorhanden ist, wird diese als unterschiedlich betrachtet und mit der Quellversion synchronisiert.

Das ist das erwartete (und sicherere) Verhalten. Angenommen, Sie haben zwei Verzeichnisse, ~ / src und ~ / dest, jeweils mit einer foobar-Datei. In ~ / src / foobar schreiben Sie "foo" und in ~ / dest / foobar schreiben Sie "bar". Jetzt synchronisieren Sie ~ / src mit ~ / dest. Was würden Sie erwarten?

Beide Dateien haben die gleiche Größe, aber die in ~ / dest ist neuer. Das Rsync-Standardverhalten besteht darin, ~ / dest / foobar durch ~ / src / foobar zu ersetzen. Natürlich könnten die Dateien identisch sein und es wäre unnötig, aber es gibt keine Möglichkeit, dies zu wissen, es sei denn, Sie führen eine Prüfsumme durch oder vergleichen Bit für Bit.

Wenn Sie dieses Verhalten nicht möchten, dh wenn neuere Dateien im Receiver beibehalten werden sollen, müssen Sie das Flag -u (--update) verwenden.

-u, --update Dadurch wird rsync gezwungen, alle Dateien zu überspringen, die auf dem Ziel vorhanden sind und eine geänderte Zeit haben, die neuer als die Quelldatei ist. (Wenn eine vorhandene Zieldatei eine Änderungszeit aufweist, die der Quelldatei entspricht, wird sie aktualisiert, wenn die Größen unterschiedlich sind.)

Rafael Cavalcanti
quelle
2
Ja, das war in der Tat das Problem. Ich habe vergessen, ein -tFlag hinzuzufügen , daher wurde die Änderungszeit für die neue Datei nicht richtig eingestellt, und nachfolgende Rsync-Aufrufe versuchten, die neuere Datei zu aktualisieren. Vielen Dank!
Rogach
13
@Rogach Immer verwenden, es rsync -asei denn, Sie haben einen guten Grund, dies nicht zu tun .
Gilles 'SO- hör auf böse zu sein'
Ich bekam das gleiche Problem mit dem OP, aber -ain diesem Fall würde es zu einem anderen Problem kommen, nämlich einem Fehler. skipping directory .Die Ursache war das-a enthält , -rund ich denke , wenn es keine Verzeichnisse im Ordner waren es diesen Fehler gibt. Wird in diesem Blogbeitrag
Kardamom
@cardamom One sollte weiterhin -astandardmäßig verwendet werden und dann alle darin enthaltenen Optionen, die Sie nicht möchten, mit dem --no-Präfix explizit deaktivieren . In deinem Fall wäre es rsync -a --no-r.
Walf,