rsync 是 Linux 下最经典、最灵活的文件同步工具。它的核心能力是通过计算文件块差异,只传输变化的部分,而不是整个文件,从而极大提升了远程拷贝和备份的效率。无论是目录间的本地镜像、通过 SSH 同步到远程服务器,还是在备份脚本中构建增量快照,rsync 都是必不可少的基石。
一、核心工作原理
rsync 工作时分为两个角色:一个作为客户端发起同步请求,另一个作为服务端(可以是远程主机的 rsync 进程,也可以是本机另一个目录)。它的关键优势在于“增量算法”:当源和目标两端都有同一文件的旧版本时,rsync 会先计算两边的校验和,仅传输不匹配的数据块,而不是全量传输。对于只改动了几行的日志文件或代码仓库,这种差异传输能节省大量网络带宽和时间。
二、最常用的三种场景
1. 本地目录同步
将一个目录完整镜像到另一个目录,保持内容完全一致(包括文件权限、时间戳等):
rsync -av /source/path/ /destination/path/
-a是归档模式,相当于-rlptgoD,能递归、保留符号链接、权限、时间戳、属主和特殊文件;-v显示详细传输列表。
注意:源路径末尾的 / 很重要,带 / 表示同步该目录里面的内容到目标;不带 / 则会连目录本身一起复制到目标里。
2. 远程同步(通过 SSH)
将本地目录推送到远程服务器:
rsync -av /local/data/ user@remote_host:/backup/data/
从远程拉取到本地:
rsync -av user@remote_host:/remote/logs/ /local/logs/
rsync 默认使用 SSH 作为传输通道,这意味着所有数据传输都是加密的,且你不需要额外开启任何守护进程。如果你经常操作远程主机,可以在 ~/.ssh/config 中配置别名和密钥,让命令更简洁。
3. 增量备份与镜像同步
rsync 最强大的用法之一是借助 --delete 选项实现真正的镜像同步:目标端会删除源端不存在的文件,保持两端严格一致。这对于网站发布、备份快照等场景非常有用:
rsync -av --delete /var/www/ user@web-server:/var/www/
生产中一般会先加 --dry-run 进行试运行,确认会增、删哪些文件,防止误删:
rsync -av --delete --dry-run /source/ /dest/
如果想要保留已删除的历史文件(快照式备份),则经常会配合 --link-dest 实现增量快照:每次备份只存储变化文件,未变化的文件用硬链接指向上一份备份,从而实现节约磁盘空间的多版本备份。
三、实用选项速查
-z:传输时压缩数据,适合慢速网络;-P:等同于--partial --progress,显示进度且支持断点续传(适合大文件);--bwlimit=1000:限制传输带宽为1000KB/s,避免占满网络影响其他服务;--exclude和--exclude-from:排除指定文件或从文件读取排除列表。例如:
rsync -av --exclude='*.tmp' --exclude='cache/' /src/ /dst/
-n或--dry-run:演练模式,只显示将要执行的操作而不实际执行。
四、真实场景举例
- 网站部署:将本地构建好的静态文件推送到生产服务器,使用
--delete确保生产环境与本地完全一致。 - 数据库备份中转:先
mysqldump生成一个大 SQL 文件,然后用rsync增量同步到远程存储,每次仅传输变化部分,比全量scp快得多。 - 个人文件多机同步:结合
cron定时任务,每半小时自动将工作目录同步到一台备份服务器或 NAS。 - 目录迁移:在新服务器上使用
rsync全量同步一次数据,然后在停机窗口期间再执行一次快速增量同步,将停机时间压缩到分钟级。
五、与 scp 的区别
很多初学者用 scp 替代 rsync,但两者定位不同:
scp总是全量拷贝,不支持增量、不支持中断续传,也无法镜像删除;rsync专为同步设计,智能、高效、功能更丰富。对于需要重复同步的任务(如备份),应该优先使用rsync。
rsync 将“同步”这件事做到了极致,它简单、可靠、可脚本化,是每一个 Linux 用户都应该熟练掌握的生产力工具。