我想使用rsync 在两个方向上同步两个目录.
我指的是传统意义上的同步(不是 rsync手册中的含义):
我想在两个方向更新目录,具体取决于哪个更新.
这可以通过rsync完成(最好是以Linux方式)吗?
如果没有,还有其他解决方案吗?
jsi*_*ght 61
只需运行两次,使用"更新"模式(-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
Run Code Online (Sandbox Code Playgroud)
这不会处理删除,但我不确定只有定期同步的问题有一个很好的解决方案.
MaD*_*D70 54
Unison是Unix和Windows的文件同步工具.它允许将文件和目录集合的两个副本存储在不同的主机(或同一主机上的不同磁盘)上,单独修改,然后通过将每个副本中的更改传播到另一个副本来使其更新....
另请注意,它对故障具有弹性:
Unison可以抵御失败.即使在异常终止或通信故障的情况下,也要始终将复制品及其自身的私有结构保持在合理的状态.
Mec*_*cki 18
您需要运行rsync
两次,我建议使用以下命令运行它-au
:
rsync -au /local/source/* /remote/destination
rsync -au /remote/destination/* /local/source
Run Code Online (Sandbox Code Playgroud)
-a
(a for archive) 是一个快捷方式-rlptgoD
:
-r
递归到子目录-l
还同步符号链接-p
还同步文件权限-t
还同步文件修改时间-g
还同步文件组-o
还同步文件所有者-D
还同步特殊(非常规/元)文件基本上,无论何时您想使用 来创建相同的一对一副本rsync
,您都应该始终使用,-a
因为这是大多数用户在谈论“同步”时所期望的。这里的其他答案似乎忽略了有时文件的内容保持不变,但其所有者可能已更改或其访问权限可能已更改,在这种情况下rsync
不会同步文件,这可能是致命的。
但是您还需要-u
因为它告诉rsync
完全保留任何文件/文件夹,以防它已经存在于目的地并且具有更新的最后修改日期。如果没有-u
rsync
将同步,如果一个文件/文件夹是新的或不不管。
请注意,此解决方案无法处理已删除的文件。处理删除并不容易,因为考虑到以下情况:一个文件在源头被删除,现在如何rsync
知道该文件是否曾经存在并已被删除(在这种情况下,它也必须在目的地被删除)或者是否它从不存在于源(在这种情况下,它必须从目标复制)。这两种情况看起来相同,rsync
因此它不知道如何正确反应。反过来同步也无济于事,因为这可能会导致相同的情况:文件存在于源中,但不存在于目标中。为什么?它从未存在于目的地或已被删除?两种情况看起来都相同rsync
。
可以可靠地同步已删除文件的同步工具通常管理有关所有过去同步操作的同步日志。如果该日志显示曾经有一个文件并已同步但现在丢失了,则很明显它已被删除。如果根据日志从来没有这样的文件,它必须被同步。通过存储带有时间戳的所有日志条目,甚至有可能删除的文件回来并被多次删除,但同步工具将始终知道要做什么并且结果始终正确。rsync
没有这样的日志,它只依赖于操作两侧的当前文件状态。
但是,您可以使用rsync
一些 POSIX shell 脚本来构建自己的同步命令,该脚本已经非常接近上述同步工具。由于我自己需要这样的工具,因此这里有一个关于 Stackoverflow 的答案,可指导您创建这样的脚本。
小智 6
谢谢jsight
rsync -urv --progress dir_a dir_b && rsync -urv --progress dir_b dir_a
Run Code Online (Sandbox Code Playgroud)
这将导致第一次同步结束后立即发生第二次同步.如果目录结构很大,这将节省时间,因为不需要坐在电脑前.如果结构很大,请删除详细和进度
rsync -ur dir_a dir_b && rsync -ur dir_b dir_a
Run Code Online (Sandbox Code Playgroud)