unison 是一款跨 Windows/Linux/MacOS 平台的双向文件同步工具,不仅支持本地对本地同步,也支持通过 SSH、RSH 和 Socket 等网络协议进行同步;但需要注意的是,unison 无法实现实时双向同步,仅支持猝发实时同步。
unison 安装
Linux
unison 可以直接安装预编译包:sudo apt-get install unison
Others
Windows、MacOS 以及其它平台和源码,都能够在官方 Github 仓库的 Release 页面下载。
两个文件夹之间双向同步文件
在两台主机之间进行文件夹同步,需要确保主机都正确安装了 unison,并部署了 ssh 服务。unison 会开启一个监听端口,使用 unison dir1 ssh://username@remotehostname(ip)//absolute/path/to/dir2 结构的命令即可进行文件同步。
注意:两个文件夹的顺序是任意的,且只能够在远程和本地、本地和本地之间进行同步,不能够对两台远程机进行操作。
本地文件夹进行同步,直接使用 unison dir1 dir2 进行同步即可。
unison 的配置选项
unison 会在用户目录创建一个 .unison 文件夹来保存相关的配置,里面一般会存有 defalut.prf 作为默认配置。在平时可以通过 unison default dir1 dir2 来选择 default 作为配置文件进行同步。除了使用配置文件外,unison 命令还可以接受如下的一些参数:
-testserver测试连通性,连接到服务器即退出;如果服务器端 unison 可执行文件不在默认目录下,甚至没有 unison 命令(需要你编译一个上传到服务器),则需要使用 -servercmd 参数告诉要执行的服务器 unison 命令位置。 使用 -testserver 参数,则成功链接即退出,也不会去执行目录的比较等后续操作。-auto接受缺省的动作,然后等待用户确认是否执行。-batchbatch mode, 全自动模式,接受缺省动作,并执行。-ignore xxx增加 xxx 到忽略列表中-ignorecase [true|false|default]是否忽略文件名大小写-follow xxx是否支持对符号连接指向内容的同步; 例如在我的/.unison 的配置文件 default.prf 中有 # Unison preferences file follow = Path {unison_} ignore = Path {WWWROOT/wiki_mirror} ignore = Name {,.}{.$lock} ignore = Name {a.out} 我将预进行同步的系统文件在 xxx/src 下分别作符号链接,如 unison_httpd.conf 指向 c:/program files/apache/…/httpd.conf。 同步时,“follow = Path {unison_*}” 配置(或参数)将跟踪符号链接指向的实际文件。 如果没有该设置,符号链接不予同步。-immutable xxx不变目录,扫描时即忽略-silent安静模式-times同步修改时间-path xxx参数,只同步
需要注意的地方
FAT
我平常主要使用 unison 进行 WSL 和 Windows 之间的文件同步,而两者的文件系统是完全不一样的,所以在 default.prf 中需要添加 fat = true 来保证文件的正确传输,否则会报错提示。
权限问题
在两个文件夹进行同步的时候,可能会出现一边能够正常打开而另一边 Permission Denied 的情况,这是由权限问题所导致的。解决这个问题可以在 default.prf 中添加 perms = -1,从而保证两边都能够正常打开和使用文件。