Linux目录双向同步完全指南:Unison从入门到实战

在日常工作和运维中,我们经常遇到这样的需求:两个目录 A 和 B 都可能随时新增或修改文件,希望它们最终保持完全一致,同时绝不能删除任何文件。这种场景下,传统的 rsync 单向同步方案显得力不从心,而 Unison 正是解决这一问题的利器。

本文将深入讲解 Unison 的安装、使用、冲突处理机制,以及如何安全地实现双向同步。

一、为什么 rsync 不够用?

很多人首先想到的是 rsync,但它的局限很明显:

1
2
# 这条命令无法实现真正的双向同步
rsync -a --update A/ B/

问题所在

  • rsync 本质是单向 工具,只能从源到目标。
  • --update 只保护目标端的新文件,不会反向同步。
  • 即使执行两次rsync, 也无法安全处理两边同时新增或修改的场景。

结论 纯新增文件(从不修改)的场景可以用两次rsync拼凑,但是只要涉及修改,就需要真正的双向同步工具。

二、Unison 简介

Unison 是一款跨平台的双向文件同步工具,核心特性:

  • 真正的双向同步: 自动检测并传播两边的变更
  • 安全第一: 冲突时不会自动覆盖,需要明确处理
  • 增量传输:只同步差异部分,节省带宽和时间
  • 跨平台LinuxmacOSWindows均可使用
  • 支持SSH: 可同步远程服务器目录

安装 Uniso

1
sudo pacman -S uniso

基础用法

最简单的双向同步

1
unison /path/to/A/ /path/to/B

执行后,Unison会扫描两个目录,并逐一询问如何处理每个差异。

自动模式(跳过非冲突确认)

1
unison -auto /path/to/A/ /path/to/B/
  • 作用:自动接受所有非冲突的变更(新增、更新、删除)
  • 冲突:仍然会停下等待用户选择

完全静默模式(适合脚本/写明任务)

1
unison -batch /path/to/A/ /path/to/B/
  • 作用:不问任何问题
  • 冲突时:直接跳过,不做任何处理
  • 注意:冲突会导致目录不一致,需配合-prefer newer使用

冲突处理机制

模式 冲突处理方式 适用场景
默认(交互) 停下来询问用户选择 重要数据,需要人工判断
-auto 停下来询问 同上
-batch 直接跳过,不处理 不适合,除非配合-prefer
-batch -prefer newer 自动选择修改时间更新的版本 日志、缓存等可自动决策的数据
-batch -prefer A 始终以A为准覆盖B 有明确主次的同步