Pourquoi rsync tente de copier un fichier déjà à jour?

24

J'ai deux mêmes fichiers, sur la machine locale et sur un distant. Leurs tailles sont égales et le fichier sur la machine locale est plus récent que sur un ordinateur distant - mais rsync tente toujours de copier le fichier.

J'invoque rsync comme suit:

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

(si je n'utilise pas d' -noption, il lance l'opération de copie)

Les documents Rsync indiquent explicitement que cela ne devrait pas se produire:

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.

Sorties de 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

Pourquoi cela arrive-t-il?

MISE À JOUR:

Faire le rsync --size-onlyfichier de résultats non copié:

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
la source

Réponses:

37

L'algorithme de vérification rapide considérera comme modifié tout fichier dont l'heure de modification ou la taille est différente. Donc, si votre répertoire de destination a une version plus récente du même fichier, il sera considéré comme différent et il sera synchronisé avec la version source.

C'est le comportement attendu (et plus sûr). Par exemple, supposons que vous ayez deux répertoires, ~ / src et ~ / dest, chacun avec un fichier foobar. Dans ~ / src / foobar vous écrivez "foo", puis dans ~ / dest / foobar vous écrivez "bar". Vous rsync maintenant ~ / src à ~ / dest. Qu'attendriez-vous?

Les deux fichiers ont la même taille, mais celui de ~ / dest est plus récent. Le comportement standard de Rsync consiste à remplacer ~ / dest / foobar par ~ / src / foobar. Bien sûr, les fichiers pourraient être identiques et ce ne serait pas nécessaire, mais il n'y a aucun moyen de le savoir, sauf si vous effectuez une somme de contrôle ou comparez bit par bit.

Si vous ne voulez pas ce comportement, c'est-à-dire que vous voulez que les nouveaux fichiers du récepteur soient conservés, vous devez utiliser le drapeau -u (--update).

-u, --update Cela force rsync à ignorer tous les fichiers qui existent sur la destination et dont l'heure modifiée est plus récente que le fichier source. (Si un fichier de destination existant a un temps de modification égal à celui du fichier source, il sera mis à jour si les tailles sont différentes.)

Rafael Cavalcanti
la source
2
Oui, c'était bien le problème. J'ai oublié d'ajouter un -tindicateur, donc il ne définissait pas l'heure de modification appropriée sur le nouveau fichier, et les invocations rsync suivantes essayaient de mettre à jour le fichier plus récent. Merci!
Rogach
13
@Rogach Utilisez toujours rsync -asauf si vous avez une bonne raison de ne pas le faire.
Gilles 'SO- arrête d'être méchant'
J'obtenais le même problème de l'OP mais -adans ce cas conduirait à un problème différent, à savoir une erreur skipping directory .La cause était qu'il -acontient -ret je pense que s'il n'y avait pas de répertoires dans le dossier, il donne cette erreur. Est discuté dans ce billet de blog
cardamome
@cardamom One devrait toujours utiliser -apar défaut, puis désactiver explicitement toute option qu'il inclut que vous ne voulez pas, avec le --no-préfixe. Dans votre cas, ça le serait rsync -a --no-r.
Walf