Dlaczego rsync próbuje skopiować plik, który jest już aktualny?

24

Mam dwa takie same pliki, na komputerze lokalnym i zdalnym. Ich rozmiary są równe, a plik na komputerze lokalnym jest nowszy niż na komputerze zdalnym - ale rsync nadal próbuje skopiować plik.

Wzywam rsync w następujący sposób:

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

(jeśli nie użyję -nopcji, inicjuje operację kopiowania)

Dokumenty Rsync wyraźnie stwierdzają, że tak nie powinno być:

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.

Wyjścia z 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

Dlaczego to się dzieje?

AKTUALIZACJA:

Wykonywanie rsync --size-onlypliku wyników nie jest kopiowane:

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
źródło

Odpowiedzi:

37

Algorytm szybkiej kontroli uznaje za zmodyfikowany każdy plik, który ma inny czas modyfikacji lub inny rozmiar. Jeśli więc katalog docelowy ma nowszą wersję tego samego pliku, zostanie uznany za inny i zostanie zsynchronizowany z wersją źródłową.

Takie jest oczekiwane (i bezpieczniejsze) zachowanie. Załóżmy na przykład, że masz dwa katalogi ~ / src i ~ / dest, każdy z plikiem foobar. W ~ / src / foobar piszesz „foo”, a następnie w ~ / dest / foobar piszesz „bar”. Teraz rsync ~ / src to ~ / dest. Czego byś oczekiwał

Oba pliki mają ten sam rozmiar, ale ten w ~ / dest jest nowszy. Standardowe zachowanie Rsync polega na zamianie ~ / dest / foobar na ~ / src / foobar. Oczywiście pliki mogą być identyczne i byłyby niepotrzebne, ale nie można tego wiedzieć, chyba że wykonasz sumę kontrolną lub porównasz bit po bicie.

Jeśli nie chcesz tego zachowania, to znaczy chcesz zachować nowsze pliki w odbiorniku, musisz użyć flagi -u (--update).

-u, --update Zmusza rsync do pominięcia wszystkich plików, które istnieją w miejscu docelowym i mają zmodyfikowany czas nowszy niż plik źródłowy. (Jeśli istniejący plik docelowy ma czas modyfikacji równy czasowi pliku źródłowego, zostanie zaktualizowany, jeśli rozmiary są różne).

Rafael Cavalcanti
źródło
2
Tak, to rzeczywiście był problem. Zapomniałem dodać -tflagi, więc nie ustawiał właściwego czasu modyfikacji nowego pliku, a kolejne wywołania rsync próbowały zaktualizować nowszy plik. Dzięki!
Rogach,
13
@Rogach Zawsze używaj, rsync -achyba że masz dobry powód, aby tego nie robić.
Gilles 'SO - przestań być zły'
Dostawałem ten sam problem z OP, ale -aw tym przypadku doprowadziłoby to do innego problemu, a mianowicie do błęduskipping directory . Przyczyną było to, że -azawiera -ri myślę, że gdyby nie było katalogów w folderze daje ten błąd. Omówiono w tym poście na blogu
kardamon
@ cardamom Należy nadal używać -adomyślnie, a następnie jawnie wyłączyć wszelkie zawarte w nim opcje, których nie chcesz, z --no-prefiksem. W twoim przypadku byłoby rsync -a --no-r.
Walf