RSync:如何在两个方向上同步?


82

我想使用rsync在两个方向上同步两个目录。

我指的是经典意义上的同步(不是rsync手册中的含义):
我想双向更新目录,具体取决于哪个目录是较新的

可以通过rsync (在Linux方式中更可取)完成此操作吗?
如果没有,还有哪些其他解决方案?


3
我相信在serverfault.com上您会得到更好的答案。
EstebanKüber09年

Answers:


77

只需使用“较新”模式(-u或--update标志)加上-t(复制文件修改时间),-r(用于递归文件夹)和-v(用于详细输出以查看其内容)运行两次即可。在做):

rsync -rtuv /path/to/dir_a/* /path/to/dir_b
rsync -rtuv /path/to/dir_b/* /path/to/dir_a

这不能处理删除,但是我不确定仅通过定期同步就可以很好地解决该问题。


3
由于问题是关于rsync的,因此我将此答案标记为正确。
09年

2
但是您也询问其他解决方案,Unison做得更好,否则我将永远不会提及其他工具。我了解您可能在某些特定情况下赞成使用rsync。
MaD70

1
嘘,您有6票赞成票,您还在抱怨吗?<j / k> Unison是一个非常有趣的解决方案,很高兴您提到它。:)
jsight

2
好吧,我不是在抱怨,而是在解释。只是为了检查我是否没有遗漏任何东西(不是以英语为母语的人)。
MaD70

1
MaD70-没问题...我只是在开玩笑。:)
jsight

63

您知道Unison文件同步器吗?

Unison是用于Unix和Windows的文件同步工具。它允许将文件和目录集合的两个副本存储在不同的主机(或同一主机上的不同磁盘)上,分别进行修改,然后通过将每个副本中的更改传播到另一个副本来使其更新。...

还要注意,它可以抵抗失败:

Unison容忍失败。即使在异常终止或通信失败的情况下,也要始终保持副本及其私有结构处于明智状态。


2
+1。Unison是执行此操作的最佳方法。Double-rsync很难正确处理,根本不处理删除操作。
Avdi

是的,Unison具有故障恢复能力。我正在更新我的答案以强调这一点。
MaD70

4
还没听说过Unison。您有责任今天让我在家里重做备份脚本。
EstebanKüber09年

1
我很高兴我的回答如此有用(这表明基于扎实的理论基础的工具如何实用)。
MaD70

这是linuxjournal上Unison的简短教程
lepe 2014年

12

您需要运行rsync两次,我建议使用以下命令运行它-au

rsync -au /local/source/* /remote/destination
rsync -au /remote/destination/* /local/source

-a(用于归档)是以下操作的快捷方式-rlptgoD

  • -r 递归到子目录
  • -l 同时同步符号链接
  • -p 还同步文件权限
  • -t 还同步文件修改时间
  • -g 同时同步文件组
  • -o 同时同步文件所有者
  • -D 还同步特殊(非常规/元)文件

基本上,每当您要使用创建相同的一对一副本时rsync,都应始终使用,-a因为这是大多数用户在谈论“同步”时希望发生的事情。这里的其他答案似乎忽略了,有时文件的内容保持不变,但文件所有者可能已更改,或者其访问权限可能已更改,在这种情况下rsync将不会同步文件,这可能是致命的。

但是您还需要这样做-ursync如果文件/文件夹已经存在于目标位置并且具有较新的上次修改日期,则要完全保留任何文件/文件夹。如果没有-u rsync,则无论文件/文件夹是否更新,都将同步。

请注意,此解决方案无法处理已删除的文件。考虑到以下情况,处理删除是不容易的:在源上已删除文件,现在如何rsync知道该文件是否曾经存在并已删除(在这种情况下也必须在目标位置删除),或者是否它从不存在(在这种情况下,必须从目标复制)。这两种情况看起来相同,rsync因此无法知道如何正确反应。反过来同步也无济于事,因为这可能导致相同的情况:文件位于源位置,而不位于目标位置。为什么?它是永远不会存在于目的地还是已被删除?两种情况看起来都与相同rsync

能够可靠地同步已删除文件的同步工具通常会管理有关所有过去同步操作的同步日志。如果该日志显示曾经有一个文件已被同步,但是现在丢失了,则很明显它已被删除。如果根据日志从未出现过这样的文件,则必须对其进行同步。通过存储所有带有时间戳的日志条目,删除的文件甚至有可能返回并被删除多次,而同步工具将始终知道该怎么做,并且结果总是正确的。rsync没有这样的日志,它仅取决于操作两侧的当前文件状态。

但是,您可以使用rsyncPOSIX shell脚本和一点点的POSIX Shell脚本来构建自己的同步命令,该脚本已经非常接近如上所述的同步工具。当我自己需要这样的工具时,这是有关Stackoverflow的答案,它会指导您完成此类脚本的创建。


装饰精美。
Peter Rowntree

6

谢谢jsight

rsync -urv --progress dir_a dir_b && rsync -urv  --progress dir_b dir_a

这将导致第一次同步结束后立即进行第二次同步。如果目录结构很大,则可以节省时间,因为不需要坐在电脑前。如果结构很大,请删除详细的进度文件

rsync -ur dir_a dir_b && rsync -ur dir_b dir_a

1
只想知道我是否应该添加-t复制文件修改时间。我有理由离开-t吗?
chrips

@Chrips不,我不这么认为。看来,此答案的目的只是为了表明您可以&&在两个命令之间使用该命令在第一个命令之后立即自动运行第二个命令(如果第一个命令成功),而不是手动依次运行另一个命令(例如在@jsight的答案中。另外,我认为@jsight的答案已经过编辑,以包含-t该答案发布后的选项。
Ruben9922 '19

1

使用 rsync <OPTIONS> [hostname:]source-dir [hostname:]dest-dir

例如:

rsync -pogtEtvr --progress --bwlimit=2000 xxx-files different-stuff

会将xxx文件同步到different-stuff / xxx-files。如果不存在different-stuff / xxx-files,它将创建它-即复制它。

-pogtEtv -只是一堆保留文件元数据的选项,加上v-详细和r-递归

--progress -实时显示同步进度-复制大文件时超级有用

--bwlimit=2000 -设置复制/同步的最大速度(带宽=带宽)

当您在本地计算机上通过网络工作时,PS rsync至关重要,您可以使用诸如cp之类的命令。

祝好运!


0

我使用的是rsyncinotifywait。当您更改任何文件时,rsync将被执行。

inotifywait -m --exclude "$_LOG_FILE" -r -e create,delete,delete_self,modify,moved_to --format "%w%f" "$folder"

您需要inotifywait在两个主机上都运行。请检查示例inotifywait


0

您需要的是Rclone。Rclone(“用于云存储的rsync”)是一个命令行Linux程序,用于将文件和目录与不同的云存储提供程序(box,dropbox,ftp等)和本地文件系统之间进行同步。Rlone仅支持镜像同步。

另一个包含实时同步的图形化解决方案是使用FreeFileSync,其中包括程序RealTimeSync。FreefileSync支持双向双向同步,包括处理删除。

FreFileSync GUI

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.