神兵利器:文件双向同步工具──Unison

序言

  在日常的开发与文件管理工作中,我们可能需要在两个不同目录之间保持内容一致。例如,我们希望在多处维护同一份资料,避免手动复制带来的麻烦与风险。

  macOS 提供了强大的文件系统机制,但默认并不具备实时、双向同步的功能。Unison 正是在这种需求下脱颖而出的高效工具。它轻量、跨平台、可配置性强,能够在两个目录间实现真正的双向同步:无论哪一方发生变化,另一方都能自动更新,保持内容完全一致。

  本篇文章将从零开始,带你系统了解如何在 macOS 上安装、配置并运行 Unison,实现如下目标:

  • 🧩 在两个独立目录(A 与 B)间保持实时同步;
  • 🔁 自动检测文件的新增、修改与删除;
  • 🧱 在发生冲突时自动判断或提示处理;
  • ⚙️ 支持后台常驻运行、定时任务或实时监听模式;
  • 🧾 提供详细的命令说明与一键启动脚本。

  通过本教程,你将掌握一套稳定、安全且可扩展的文件同步方案,无论是用于开发环境镜像、资料备份,还是项目文件共享,都能高效、可靠地运作。

集成步骤

  1. 安装与验证 Unison
  2. 建立配置文件
  3. 编写一键执行脚本(可自动同步)
  4. 讲解常用命令与参数

🧩 一、安装 Unison

在 macOS 上通过 Homebrew 安装:

1
brew install unison

检查是否安装成功:

1
unison -version

输出类似:

1
unison version 2.53.3

✅ 表示安装成功。


📂 二、假设目录结构

我们设定两个目录(本地双向同步):

1
2
A = /Users/lee/Documents/A
B = /Users/lee/Documents/B

目标:

  • 修改 A → 自动同步到 B
  • 修改 B → 自动同步到 A
  • 删除或新增也同步
  • 保留日志与冲突提示

🧰 三、创建配置文件(推荐方式)

Unison 默认会在:

1
~/.unison/

这个目录下存放配置文件(以 .prf 为后缀)。

创建配置文件:

1
2
mkdir -p ~/.unison
nano ~/.unison/ab-sync.prf

输入以下内容(可直接复制):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# ~/.unison/ab-sync.prf

# --- 基本路径 ---
root = /Users/wk/Documents/Dvorac/Program
root = /Users/wk/hexo/my-blog/blog/source/_posts

# --- 同步选项 ---
# 自动执行操作,无需确认
auto = true
# 自动模式,不提示交互
batch = true
# 删除很多文件时仍需确认
confirmbigdel = true
# 通过时间戳判断文件变化
fastcheck = true
# 如果冲突,优先保留较新的文件
prefer = newer
# 启用日志
log = true
logfile = /Users/wk/.unison/unison.log

# --- 忽略规则(可选)---
ignore = Name {.DS_Store}
ignore = Name {*.tmp}
ignore = Name {*.bak}

# --- 性能优化 每300秒自动同步一次
repeat = 300

保存后退出(Ctrl + O 回车,Ctrl + X 退出)。


🚀 四、执行同步命令

在终端中直接运行:

1
unison ab-sync

效果:

  • Unison 会根据 ab-sync.prf 文件自动识别目录并开始同步。
  • 首次运行会扫描两边文件并建立索引。
  • 日志记录在 /Users/lee/Documents/unison.log

之后每次只要执行这条命令 就能进行双向同步。


🌀 五、后台自动同步(守护进程方式)

如果你希望它持续自动同步(比如每隔几分钟),可以使用 repeat 参数或配合 macOS launchd/cron

方法 1:直接运行重复同步模式

1
unison ab-sync -repeat watch

🔹 意思是:Unison 会实时监控两边文件变化(通过 FSEvents),一旦检测变化就自动同步。
🔹 这种方式最适合你这种“修改即同步”的场景。

可在后台运行:

1
nohup unison ab-sync -repeat watch > /Users/lee/Documents/unison-daemon.log 2>&1 &

方法 2:使用 Cron 定时同步

1
crontab -e

添加:

1
*/5 * * * * /usr/local/bin/unison ab-sync

表示每 5 分钟同步一次。


💻 六、一键脚本示例

创建脚本 /Users/lee/Documents/run-unison-sync.sh

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
CONFIG_NAME="ab-sync"
LOG_FILE="/Users/lee/Documents/unison-daemon.log"

echo "[$(date '+%Y-%m-%d %H:%M:%S')] Starting Unison Sync ($CONFIG_NAME) ..." >> "$LOG_FILE"

# 后台自动监听模式
nohup unison "$CONFIG_NAME" -repeat watch >> "$LOG_FILE" 2>&1 &

echo "Unison sync started in background. Log: $LOG_FILE"

运行:

1
2
chmod +x /Users/lee/Documents/run-unison-sync.sh
/Users/lee/Documents/run-unison-sync.sh

✅ 从此之后,Unison 就会在后台自动保持 A 与 B 同步。


🧠 七、常用命令说明

命令 说明
unison ab-sync 按配置文件同步(一次性)
unison ab-sync -repeat watch 实时监控自动同步
unison ab-sync -ui text 纯命令行输出(默认)
unison ab-sync -ui graphic 图形界面模式
unison ab-sync -batch 无交互批处理模式
unison ab-sync -force /path/A 强制以 A 为主覆盖 B
unison ab-sync -logfile /tmp/unison.log 指定日志文件
unison -showarchives 查看同步索引信息
unison -removearchives 清除索引缓存(重建)

🧩 八、冲突与安全机制

Unison 会自动检测冲突(两边文件同时修改),行为如下:

  • 如果设置了 prefer = newer → 自动选时间较新的文件
  • 如果设置了 prefer = /path/A → 永远以 A 为准
  • 如果无法判断,会在命令行提示选择

✅ 总结

目标 方法
双向实时同步 unison ab-sync -repeat watch
仅单次同步 unison ab-sync
自动后台运行 nohup unison ab-sync -repeat watch &
优先 A 目录 prefer = /Users/lee/Documents/A
定时同步 crontabrepeat = 300
0%