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

Rog*_*ach 26 rsync

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

我调用 rsync 如下:

rsync -nv -e "ssh -p 2222" user@host:/data/file.fif data/file.fif
Run Code Online (Sandbox Code Playgroud)

(如果我不使用-n选项,它会启动复制操作)

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.
Run Code Online (Sandbox Code Playgroud)

输出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
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?

更新:

这样做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)
Run Code Online (Sandbox Code Playgroud)

Raf*_*nti 42

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

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

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

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

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

  • @Rogach 总是使用 `rsync -a`,除非你有充分的理由不这样做。 (15认同)
  • 是的,这确实是问题所在。我忘记添加 `-t` 标志,因此它没有在新文件上设置正确的修改时间,并且随后的 rsync 调用试图更新较新的文件。谢谢! (4认同)