为什么rsync尝试复制已经是最新的文件?


24

我在本地计算机和远程计算机上有两个相同的文件。它们的大小相等,并且本地计算机上的文件比远程计算机上的文件新-但rsync仍尝试复制文件。

我按如下方式调用rsync:

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

(如果我不使用-noption,它将启动复制操作)

Rsync文档明确指出不应发生这种情况:

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.

来自的输出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

为什么会这样?

更新:

执行rsync --size-only结果文件未复制:

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)

Answers:


37

快速检查算法会将具有不同修改时间或不同大小的任何文件视为已修改。因此,如果您的目标目录具有相同文件的较新版本,则将其视为不同版本,并将其同步到源版本。

这是预期的(和更安全的)行为。例如,假设您有两个目录〜/ src和〜/ dest,每个目录都有一个foobar文件。在〜/ src / foobar中,您写“ foo”,然后在〜/ dest / foobar中,您写“ bar”。现在,您将〜/ src同步到〜/ dest。您会期待什么?

这两个文件的大小相同,但是〜/ dest中的文件较新。Rsync的标准行为是将〜/ dest / foobar替换为〜/ src / foobar。当然,这些文件可能是相同的,并且不是必需的,但是除非您执行校验和或逐位比较,否则没有办法知道。

如果您不希望这种行为,也就是说,想要保留接收者中的较新文件,则必须使用-u(--update)标志。

-u,--update这将强制rsync跳过目标上存在的且具有比源文件新的修改时间的所有文件。(如果现有目标文件的修改时间等于源文件的修改时间,则如果大小不同,它将被更新。)


2
是的,确实是问题所在。我忘记添加-t标志,因此它没有在新文件上设置适当的修改时间,随后的rsync调用试图更新新文件。谢谢!
Rogach 2013年

13
@Rogach rsync -a除非有充分理由不这样做,否则请始终使用。
吉尔(Gilles)'所以

我遇到了OP的相同问题,但是-a在这种情况下会导致另一个问题,即错误skipping directory .。原因是-a包含该错误-r,我认为如果文件夹中没有目录,则会出现该错误。在此博客文章中
cardamom

@cardamom -a默认情况下仍应使用@cardamom ,然后使用--no-前缀明确禁用它包括的所有不需要的选项。在你的情况下rsync -a --no-r
沃尔夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.