我正在尝试设置两台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工具。
答案 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
上更新的文件更新loc1Et 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,但我认为它的行为应该相同 如果源和目录是完整路径,包括机器名称。