如何仅同步新文件


143

我正在尝试设置rsync,以通过将新生成的文件添加到远程服务器来将我的主要Web服务器同步到远程服务器。

这是我使用的命令:

rsync -avh --update -e "ssh -i /path/to/thishost-rsync-key" remoteuser@remotehost:/foo/bar /foo/bar

但是似乎Web服务器实际上在传输所有文件,尽管带有'--update'标志。我尝试了不同的标志组合(例如,省略了“ -a”而使用了“ -uv”),但是没有一个帮助。所以想知道如何修改rsync命令以仅发送新添加的文件。谢谢


2
如果要将文件同步远程服务器,它不应该排在最后吗? rsync /foo/bar remoteuser@remotehost:/foo/bar
ostrokach

您可能对此网页感兴趣。另外,请注意文件系统。如果服务器的文件系统不支持所有该-a选项所隐含的(所有者,组,权限……),则应是导致此问题的原因。
2015年

2
没有一个答案可以解决以下问题:本地文件未完全复制到远程目标,而您只想同步更新的文件。
Axel Bregnsbo,2016年

我刚刚找到了-c选择。它根据校验和而不是修改时间或大小跳过现有文件。
haheute

Answers:


180

来自man rsync

--ignore-existing       skip updating files that exist on receiver

--update所做的事情略有不同,这可能就是为什么您得到意想不到的结果(请参阅参考资料man rsync):

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


1
好吧,实际上我尝试使用“ --ignore-existing”而不是“ --update”命令。它完成得很快,但是没有将新文件放入远程主机。有任何想法吗?谢谢
supermario

13
手册页很烂(我去过那儿是对的),例如,这是否--ignore-existing意味着不传输接收方存在的文件,或者如果接收方存在某些具有相同名称的文件/文件夹,也不传输文件?
2013年

7
--update 跳过文件时的mtimes是相同的(这是措辞意味着什么)。我测试了这个。我相信,如果说“仅复制比目标更新的源文件”,则可以更好地理解该措词。
章鱼

4
@Octopus“将仅复制比目标更新的源文件” ...或与目标文件对应的修改时间相同但大小不同的源文件。我认为这是重要的一点。(感
谢克里斯

因此,您需要--ignore-existing和-r(递归)。-v(详细)也很不错:-)
DutchUncle

40

就我而言,我遇到了类似的问题,即传输所有文件,而不是仅传输已修改/新的文件。我通过使用参数-t(而不是-a)和-P(等于--partial --progress)解决了这个问题:

rsync -h -v -r -P -t 目标

这仅传输新文件,以及已存在但已修改的文件:-a执行太多操作,例如用户和组ID同步,在我的情况下,由于源和目标系统上有不同的用户和组,因此无法使用。

参数详细:

  • -h:人类可读的数字
  • -v:详细
  • -r:递归到目录
  • -P:(--partial保留部分传输的文件)+
            --progress(显示传输过程中的进度)
  • -t:保留修改时间

2
+1为“ -a做得太多”(的确如此-rlptgoD,因此权限不会受到影响,组和所有者都得到保留–不是我典型的安全播放备份...)
Frank Nocke

2

根据我对rsync的经验,1TB分区复制太大而无法高效执行。rsync永远需要处理。而是通过子目录来执行。也就是说,对每个主子目录运行rsync。如果不必处理成千上万个文件,它将更快。


1
也许您的内存不足,系统开始交换了?
Marcel Burkhard

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.