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

这是我使用的命令:

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


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

评论

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

您可能对此网页感兴趣。另外,请注意文件系统。如果服务器的文件系统不支持所有这些选项,则-a选项所隐含的(所有者,组,权限……)应该是导致我们出现问题的原因。
没有任何答案可以解决本地文件未完全复制到远程目标的问题,而您只想同步更新的文件。

我刚刚找到了-c选项。它会基于校验和而不是修改时间或大小来跳过现有文件。

#1 楼

来自man rsync

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


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


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


评论


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

–supermario
13年3月12日在2:34

手册页很烂(我去过那儿是对的),例如,--ignore-existing表示不传输接收方存在的文件,或者如果传输的文件/文件夹中存在相同名称的文件/文件夹,则不传输文件接收者?

– puk
13年20月20日在9:05

当mtimes相同时,--update会跳过文件(这不是措辞所暗示的)。我测试了这个。我相信,如果说“仅复制比目标更新的源文件”,则可以更好地理解该措词。

–章鱼
15年11月28日在7:41

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

–乔纳森·科玛(Jonathan Komar)
17年4月21日在8:24



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

–DutchUncle
18年2月4日在18:57

#2 楼

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



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


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

详细的参数:



-h:人类可读的数字

-v:冗长的

-r:递归到目录

-P--partial(保留部分传输的文件)+
--progress(显示传输过程中的进度)

-t :保留修改时间


评论


+1为“ -a做得太多”(实际上是-rlptgoD,因此权限不会被修改,组和所有者仍保留-不是我通常的安全播放备份...)

–弗兰克·诺克(Frank Nocke)
18-10-18在11:39

为我工作。为了方便起见,我更喜欢输入rsync -hvrPt。

– Manngo
20年1月19日在6:01

#3 楼

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

评论


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

– Marcel Burkhard
16-2-26在21:24