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
接受缺省的动作,然后等待用户确认是否执行。-batch
batch 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
,从而保证两边都能够正常打开和使用文件。