Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Synchronization 若服务器上的文件不同,rsync是否会忽略文件时间戳并在客户端自动覆盖?_Synchronization_Rsync - Fatal编程技术网

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

Synchronization 若服务器上的文件不同,rsync是否会忽略文件时间戳并在客户端自动覆盖?,synchronization,rsync,Synchronization,Rsync,我正在尝试设置两台电脑来同步一个文件夹树,这样每台电脑都会有一个文件夹树的副本,其中包含每个文件的最新更新 我曾考虑过设置Mercurial,但意识到我并不真正关心版本控制(特别是因为我的磁盘空间不足),而且rsync听上去更像是我想要的东西——只是让文件保持最新,没有版本 但是,页面上的内容如下: 使用rsync,任何已经 目标位置上的存在将不会被删除 转移。这加快了速度 转移时间相当长。然而, 现在仍然有一个问题,那就是 双方都做了修改。通过 默认情况下,rsync程序只显示 以查看文件在中

我正在尝试设置两台电脑来同步一个文件夹树,这样每台电脑都会有一个文件夹树的副本,其中包含每个文件的最新更新

我曾考虑过设置Mercurial,但意识到我并不真正关心版本控制(特别是因为我的磁盘空间不足),而且rsync听上去更像是我想要的东西——只是让文件保持最新,没有版本

但是,页面上的内容如下:

使用rsync,任何已经 目标位置上的存在将不会被删除 转移。这加快了速度 转移时间相当长。然而, 现在仍然有一个问题,那就是 双方都做了修改。通过 默认情况下,rsync程序只显示 以查看文件在中是否不同 大小和时间戳。它不在乎 哪个文件较新(如果是) 不同的是,它会被覆盖

您可以将'--update'标志传递给rsync 这将导致它跳过上的文件 如果目标文件比目标文件更新,则返回目标文件 源上的文件,但仅此而已 只要它们是同一类型的 文件这意味着如果 例如,源文件是一个常规文件 文件,并且目标是符号链接, 目标文件将被删除 覆盖,与时间戳无关。 即使不考虑它的怪癖 --更新标志不能解决问题,因为它所做的只是跳过 目标上的文件(如果有) 更新后,它不会进行这些更改 到源计算机

这是正确的吗

如果是这样的话,我想rsync只在将一台主(“源”)计算机备份到一台或多台从属计算机上时才有用,这些从属计算机将从主计算机获得更改,而不考虑时间戳。然而,我真正想解决的问题是,让两台机器成为“对等机”,并从另一台机器获得最新更新的文件

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

(是的,我知道Dropbox;我的免费帐户远远超过2GB的限制,在我不需要云存储的情况下,我对每年花费120-240美元并不感兴趣,而在使用免费和开放工具之前,我必须做一些如此简单的事。)


这两台电脑都运行XP,但我打算使用Cygwin的rsync和任何其他Unixy工具来完成这项工作。

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

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

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

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

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


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

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

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

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

这里它只是同步了geezer和merlin的两个目录,但我认为它的行为应该是一样的
如果源和目录是包括机器名在内的完整路径。

如果您在rsync和时间戳方面有问题,那么您可能需要研究在同步过程中涉及的各种文件系统上存储时间戳的精度

使用
fstat
发现以下情况:如果同步文件,且原始文件的时间戳为2012-01-10 23:41:04.348724000,且同步文件的时间戳为2012-01-10 23:41:04.000000000,则表明精度存在差异

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

rsync av --update /loc1 /loc2
因此,只有更新的文件才会从loc1同步到loc2。 逻辑表明,loc2上更新的任何文件都将保持不变。 因此,由于loc1,loc2上的所有过期文件都将是最新的

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


瞧!在本例中,两个位置都是同步的。

这不应该是同步的。Rsync防止较新文件被较旧文件覆盖。如果您正在从服务器同步到客户端,您应该会收到消息“[file]较新”。检查您的时间戳/时区和设置。第一个命令是否可能覆盖merlin上修改过的文件?也就是说,如果geezer和merlin上都有foo.txt,但是最近在merlin上被修改了,那么geezer上的foo.txt不会覆盖它吗?