如果服务器上的文件不同,rsync是否会忽略文件时间戳并自动覆盖客户端?

时间:2010-09-04 06:40:29

标签: synchronization rsync

我正在尝试设置两台PC来同步文件夹树,以便每台PC都有一份树的副本,其中包含每个文件的最新更新。

我考虑过设置Mercurial,但意识到我并不真正关心版本控制(特别是因为我的磁盘空间不足),并且rsync听起来更像是我想做的更多 - 只是让文件保持最新,没有版本。

但是,http://www.linuxjournal.com/content/synchronizing-your-life处的页面说明如下:

  

使用rsync,已经有任何文件   存在于目的地将不会   转移。这加速了   转移时间相当大。然而,   还有问题   双方都做了修改。通过   默认情况下,rsync程序只显示   查看文件是否不同   大小和时间戳。它并不关心   哪个文件更新,如果是的话   不同,它会被覆盖。

     

您可以将'--update'标志传递给rsync   这会导致它跳过文件   目的地如果他们比新的更新   源文件,但仅限于此   只要它们是同一类型的   文件。这意味着,如果,为   例如,源文件是常规的   文件和目的地是符号链接,   目标文件将是   无论时间戳如何,都会被覆盖。   即使看过去的怪癖也是如此   --update标志不能解决问题,因为它只是跳过   目的地上的文件(如果是)   更新,它不会拉动这些变化   到源计算机。

这是对的吗?

如果是这样,我想这使得rsync真的只对将一台主(“源”)机器备份到一个或多个从机上非常有用,无论时间戳如何,它都将从主机获得更改。虽然我真正试图解决的问题是让两台机器成为“同行”,同样只是从另一台获得最近更新的文件。

或者你认为我不得不咬紧牙关并使用git或Mercurial,尽管有额外的磁盘空间用于跟踪版本?

(是的,我知道Dropbox;我远远高于2GB的免费帐户限制,并且在我不需要云存储的情况下每年花费120到240美元并不感兴趣,这个简单必须< / em>之前已经使用免费和开放工具完成了。)

PC都在运行XP,但我打算使用Cygwin的rsync以及完成工作所需的任何其他Unixy工具。

4 个答案:

答案 0 :(得分:6)

如果您遇到rsync和时间戳问题,可能需要查看在同步中涉及的各种文件系统上存储时间戳的精度。

使用fstat来发现这一点:如果您同步文件且原始文件的时间戳为2012-01-10 23:41:04.348724000,并且同步文件时间戳为2012-01-10 23:41:04.000000000那么这就是精确度差异的标志。

rsync的选项--modify-window=1可以通过允许小的差异来处理这种精度差异。

答案 1 :(得分:6)

rsync av --update /loc1 /loc2

因此只有NEWER的文件才会从loc1同步到loc2。 逻辑规定在loc2上任何NEWER的文件都不会受到影响。 因此,由于loc1

,loc2上的所有过时文件都是最新的
rsync av --update /loc2 /loc1

现在我们知道loc1具有更新的所有文件都被复制到了loc2。 loc1上较旧的文件(在loc2上有较新的文件)保持不变。 第二个rsync命令现在将使用loc2

上更新的文件更新loc1

Et Voila!在这个例子中,两个位置都是同步的。

答案 2 :(得分:3)

经过测试,我相信答案是肯定的。

至于我为什么不在问之前首先测试这个,我误解了rsync的工作方式,并认为你总是需要在服务器上设置一个rsync守护进程。

但是如果你使用ssh作为传输机制,则不需要在服务器上运行rsync守护进程,只需要一个ssh守护进程,这是更常见的。

在我的测试中,我本地计算机上更新的文件被服务器上的旧文件覆盖(即使我使用了--update选项)。

我的结论是rsync更适合主从复制/更新,而不是真正的双向,基于对等的同步。

我将不得不考虑Mercurial或可能是Microsoft SyncToy(因为两台机器都在运行XP);我可能会选择后者,因为它是一个简单的家庭网络。

答案 3 :(得分:2)

您是否尝试过两次执行rsync --update。我可能错了,但我认为如下 这对命令可以实现双向同步。

rsync -avz --stats --update geezer / merlin

rsync -avz --stats --update merlin / geezer

这里只是同步2个目录geezer和merlin,但我认为它的行为应该相同 如果源和目录是完整路径,包括机器名称。