文件夹同步工具 unison 简易指北.

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,从而保证两边都能够正常打开和使用文件。