rsync:增量同步的黄金标准
当提及文件同步,rsync(remote sync)无疑是 CentOS乃至整个 Linux 世界中最受推崇的工具,它以其高效的增量传输算法而闻名,只同步源和目标之间发生变化的文件部分,极大地节省了时间和带宽资源,即使在本地同步中,这种效率也意味着更少的 I/O 操作和更快的完成速度。

核心语法与关键细节
rsync 的基本语法非常直观:
rsync [选项] 源目录/ 目标目录/
这里有一个极易忽略但至关重要的细节:源目录末尾的斜杠()。
- 带斜杠
源目录/:表示同步该目录内的所有内容,但不包括目录本身。rsync /data/project/ /backup/会将project目录下的文件和子目录同步到/backup目录下。 - 不带斜杠
源目录:表示同步整个目录(包括目录本身及其所有内容)。rsync /data/project /backup/会在/backup目录下创建一个名为project的子目录,并将所有内容放入其中。
常用选项精解
为了充分发挥 rsync 的威力,掌握其常用选项是必不可少的,下表列出了一些最核心的选项:
| 选项 | 长选项 | 描述 |
|---|---|---|
-a |
--archive |
归档模式,相当于 -rlptgoD,递归同步,并保留所有文件属性(权限、时间戳、所有者等),这是最常用的选项。 |
-v |
--verbose |
详细模式,输出同步过程中的详细信息。 |
-z |
--compress |
在传输过程中对文件数据进行压缩,适用于网络同步,但在本地也能减少磁盘 I/O。 |
--delete |
删除目标目录中存在但源目录中不存在的文件,使目标目录与源目录完全镜像。 | |
--progress |
显示同步过程中的进度条和传输速度。 | |
-n |
--dry-run |
模拟运行(试运行),显示哪些文件将被同步,但不会实际执行操作,这是确保命令正确的安全步骤。 |
实战演练
假设我们需要将 /var/www/html 网站目录完整地备份到 /opt/backup/html,并希望在每次备份时删除备份目录中多余的文件。
-
首次模拟运行(安全第一):
rsync -avz --delete --progress /var/www/html/ /opt/backup/html/ --dry-run
-
确认无误后,执行实际同步:
rsync -avz --delete --progress /var/www/html/ /opt/backup/html/
-
自动化同步:使用
cron定时任务可以实现每日自动备份,编辑 crontab:crontab -e
添加一行,例如每天凌晨2点执行同步:
0 2 * * * /usr/bin/rsync -az --delete /var/www/html/ /opt/backup/html/ > /var/log/rsync_backup.log 2>&1
unison:双向同步的利器
rsync 主要用于单向同步(源 -> 目标),在某些场景下,例如在两台电脑之间同步文档,或是开发人员的工作目录和测试环境目录都可能被修改时,就需要双向同步工具。unison 正是这样一款优秀的工具。

unison 能够检测两个目录的差异,并允许用户决定如何解决冲突(A目录的文件复制到B,还是B的复制到A,或者保留两个版本)。
安装与基本使用
在 CentOS 上安装 unison:
sudo yum install unison # 或者在较新的版本上使用 dnf sudo dnf install unison
基本同步命令:
unison /path/to/dirA /path/to/dirB
首次运行时,unison 会扫描两个目录并展示差异,之后,它会自动同步,除非遇到冲突(即同一个文件在两处都被修改),当冲突发生时,它会进入交互模式,让你手动选择如何处理,虽然 unison 功能强大,但其在自动化脚本中的应用不如 rsync 普遍,更多用于需要人工干预的、对等的数据同步场景。
cp:最基础的“同步”方式
从广义上讲,简单的复制也可以被视为一种同步,使用 cp 命令配合 -r(递归)选项可以复制整个目录树。
cp -r /source/directory /destination/
这种方式存在明显缺点:
- 效率低下:它总是会复制所有文件,无论文件是否已存在或是否更改。
- 无法处理删除:如果源目录删除了某个文件,
cp无法在目标目录中删除对应的文件。 - 属性保留:虽然可以通过
-p选项保留部分属性,但功能远不如rsync的-a全面。
cp 只适用于一次性的完整目录复制,而不适合持续性的、智能化的文件同步任务。
方法对比与选择
为了更直观地选择合适的工具,下表对三种方法进行了小编总结:
| 特性/方法 | rsync |
unison |
cp -r |
|---|---|---|---|
| 同步类型 | 主要单向 | 双向 | 单向(复制) |
| 传输效率 | 极高(增量) | 较高(增量) | 极低(全量) |
| 删除处理 | 支持 (--delete) |
支持(智能处理) | 不支持 |
| 自动化 | 非常适合(如cron) | 一般(适合交互式) | 适合一次性脚本 |
| 典型场景 | 数据备份、镜像、部署 | 双向工作区同步、多机文档共享 | 一次性目录迁移或初始化 |
对于绝大多数 CentOS 本地文件同步需求,rsync 是首选,它集高效、灵活、可靠于一身,当你确实需要双向同步并且不介意交互式处理冲突时,unison 是一个很好的补充,而 cp 则仅在最基础的复制场景下使用。

相关问答 (FAQs)
Q1: 在使用 rsync 时,为什么 --delete 选项既重要又危险?
A1: --delete 选项的重要性在于它能确保目标目录是源目录的精确镜像,当你从源目录中删除了一个文件,下一次同步时,rsync 会自动在目标目录中删除该文件,保持两边一致性,这对于数据备份和镜像维护至关重要。
它之所以危险,是因为一旦误操作,数据可能无法恢复,如果你错误地将源目录和目标目录写反了(即 rsync ... /empty/ /important_data/ --delete),/important_data/ 目录下的所有文件都会被删除,因为空的源目录里没有任何文件,在使用 --delete 之前,强烈建议先使用 --dry-run 选项仔细检查将要执行的操作,确认无误后再去掉 --dry-run 执行。
Q2: rsync 在本地同步时,使用 -z (压缩) 选项还有意义吗?
A2: 在大多数情况下,意义不大,甚至可能带来轻微的性能开销。-z 选项的主要设计目的是为了在慢速网络连接上(如广域网)传输数据时,通过压缩来减少网络传输时间。
对于本地同步(从 /home 到 /backup),数据不经过网络,而是在本地磁盘之间传递,CPU 需要花费额外的时间来压缩和解压数据,而这些节省的 I/O 时间通常无法抵消 CPU 计算的开销,尤其是在现代 CPU 和高速存储设备(如 SSD)上,对于纯粹的本地同步,通常建议省略 -z 选项,以获得最快的同步速度,只有当同步的文件是纯文本且存储于非常慢速的机械硬盘上时,压缩才可能带来微弱的优势。