rsync是什么?
想象你要把10GB的文件从本地拷贝到服务器。用 cp 或 scp,每次都要传完整文件。如果中间断网了,得重来。如果明天只改了1MB的内容,还是要传10GB。这太浪费了。
**rsync(remote sync)**就是来解决这个问题的。它只做一件事:把源文件"同步"到目标位置,但只传变化的部分。
打个比方:你每天寄一封信给朋友。如果用传统方式,每次都要把整封信重写一遍。用rsync的方式,你只写今天新改的那几行,朋友收到后自动拼接,最后得到的还是一封完整的信。
rsync 由 Andrew Tridgell 在1996年开发,最初灵感来自他遇到的一次缓慢的文件传输经历。三十多年过去了,它依然是Linux世界最可靠的文件同步工具。
rsync凭什么这么快?
关键在于增量传输算法。
rsync不会一次性比较两个文件的每一个字节。它会先对文件做 checksum(校验和),只传输不同的部分。对于大文件里的微小改动,rsync可能只传几百字节,而不是整个文件。
另一个关键是断点续传。传输到99%断网了?没关系,重新执行rsync,它会自动跳过已传输的部分,从断点继续。
三种使用姿势
1. 本地同步
rsync -av /home/user/projects/ /backup/projects/
把 /home/user/projects/ 同步到 /backup/projects/。-a 表示归档模式(保留权限、时间戳等),-v 显示详细过程。
注意路径末尾的斜杠:有斜杠表示同步目录内容,没有斜杠表示同步目录本身。这个细节很多人会搞错。
2. 远程同步(像scp一样用)
rsync -av /local/path/ user@remote-server:/remote/path/
本地文件推到远程服务器。支持 SSH 加密传输,安全又高效。
反过来也可以从远程拉取:
rsync -av user@remote-server:/remote/path/ /local/path/
3. 增量备份
rsync -av --delete /source/ /backup/
--delete 参数很关键:它会让备份目录和源目录保持一致。源里删了某个文件,备份里也会跟着删掉。不加这个参数,备份里会保留已经删除的文件。
高频参数速查
| 参数 | 作用 |
|---|---|
-a | 归档模式,保留权限、时间戳、软链接等 |
-v | 显示详细过程 |
-z | 传输时压缩数据 |
-P | 显示进度 + 断点续传 |
--delete | 删除目标中多余的文件 |
--exclude='*.log' | 排除指定文件 |
-e ssh | 指定用 SSH 协议 |
--bwlimit=1000 | 限速(KB/s) |
-n | 干跑模式,只看不做 |
最后这个 -n 很实用。执行前先加 -n 跑一遍,看看 rsync 打算做什么操作,确认没问题后再去掉 -n 真正执行。相当于"预览"功能。
常见实战场景
场景一:网站部署
rsync -avz --exclude='.git' --exclude='node_modules/' ./user@server:/var/www/html/
把网站文件同步到服务器,跳过 Git 仓库和依赖目录。比 scp 快,支持断点续传。
场景二:定时备份
rsync -av --delete /data/ backup-server:/backups/data/
配合 cron 定时执行,每天自动增量备份。
场景三:大文件传输
rsync -avP /large-file.iso remote:/path/
大文件传输过程中断了?重新执行同一命令,rsync 会自动续传,不用从头开始。
rsync vs scp vs cp
| 特性 | rsync | scp | cp |
|---|---|---|---|
| 增量传输 | ✅ | ❌ | ❌ |
| 断点续传 | ✅ | ❌ | ❌ |
| 远程操作 | ✅ | ✅ | ❌ |
| 本地操作 | ✅ | ❌ | ✅ |
| 删除同步 | ✅ | ❌ | ❌ |
简单说:本地小文件用 cp,一次性传输用 scp,经常同步或需要增量备份用 rsync。
一句话总结
rsync 是文件同步领域的瑞士军刀——增量传输省带宽,断点续传不怕断,远程本地都能干。学会了,备份和部署效率直接翻倍。
要不要现在就在终端里 rsync -n 预览一下你的同步操作?