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

Chi*_*ael 8 rsync synchronization

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

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

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

使用rsync,将不会传输目标中已存在的任何文件.这大大加快了传输时间.但是,仍然存在对双方进行修改的问题.默认情况下,rsync程序仅查看文件的大小和时间戳是否不同.它不关心哪个文件更新,如果它不同,它会被覆盖.

您可以将'--update'标志传递给rsync,如果它们比源上的文件更新,则会导致它跳过目标上的文件,但只要它们是相同类型的文件.这意味着,例如,如果源文件是常规文件而目标是符号链接,则无论时间戳如何,目标文件都将被覆盖.即使看过它的怪癖, - update标志也无法解决问题,因为它只是跳过目的地上的文件,如果它们更新,它不会将这些更改下载到源计算机.

它是否正确?

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

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

(是的,我知道Dropbox的;我是远高于2GB的免费帐户的限制,并在每年花费$ 120- $ 240的时候我并不需要云存储和东西这个简单不是真的有兴趣已到已通过自由和之前完成打开工具.)

PC都在运行XP,但我打算使用Cygwin的rsync和任何其他Unix工具来完成工作.

Mar*_*ano 6

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

使用fstat被发现:如果你同步文件和原来的有23 2012-01-10时间戳:41:04.348724000和同步文件的时间戳2012-01-10 23:41:04.000000000那么这是一个差的符号在精度.

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


小智 6

rsync av --update /loc1 /loc2
Run Code Online (Sandbox Code Playgroud)

所以只有NEWER的文件才会从loc1同步到loc2.逻辑规定在loc2上任何NEWER的文件都不会受到影响.因此,由于loc1,loc2上的所有过时文件都是最新的

rsync av --update /loc2 /loc1
Run Code Online (Sandbox Code Playgroud)

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

Et Voila!在此示例中,两个位置都是同步的.


Chi*_*ael 3

经过测试,我相信这个问题的答案是肯定的。

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

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

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

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

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