Linux目录双向同步完全指南:Unison从入门到实战
在日常工作和运维中,我们经常遇到这样的需求:两个目录 A 和 B
都可能随时新增或修改文件,希望它们最终保持完全一致,同时绝不能删除任何文件。这种场景下,传统的
rsync 单向同步方案显得力不从心,而 Unison
正是解决这一问题的利器。
本文将深入讲解 Unison 的安装、使用、冲突处理机制,以及如何安全地实现双向同步。
一、为什么 rsync 不够用?
很多人首先想到的是 rsync,但它的局限很明显:
1 | # 这条命令无法实现真正的双向同步 |
问题所在
rsync本质是单向 工具,只能从源到目标。--update只保护目标端的新文件,不会反向同步。- 即使执行两次
rsync, 也无法安全处理两边同时新增或修改的场景。
结论
纯新增文件(从不修改)的场景可以用两次rsync拼凑,但是只要涉及修改,就需要真正的双向同步工具。
二、Unison 简介
Unison 是一款跨平台的双向文件同步工具,核心特性:
- 真正的双向同步: 自动检测并传播两边的变更
- 安全第一: 冲突时不会自动覆盖,需要明确处理
- 增量传输:只同步差异部分,节省带宽和时间
- 跨平台:
Linux、macOS和Windows均可使用 - 支持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 |
有明确主次的同步 |