做什么
最强的文件同步工具——只传差异,带断点续传,能排除,能限速,能压缩。
基础
# 本地 → 远端
rsync -avz folder/ user@host:/dest/
# 远端 → 本地
rsync -avz user@host:/source/ ./local/
# 本地 → 本地
rsync -av src/ dest/
必备参数
| 参数 | 含义 |
|---|---|
-a |
archive 模式(含 -rlptgoD,保留全部属性)★ |
-v |
verbose |
-z |
传输时压缩 |
-n |
演练(dry-run,别忘!) |
--progress |
进度 |
--delete |
同步删除(目标多余的也删) |
--exclude=P |
排除模式 |
--exclude-from=F |
从文件读排除规则 |
⚠ 斜杠的坑
rsync -av src/ dest/ # src 里的内容 → dest 里
rsync -av src dest/ # src 文件夹本身 → dest(变 dest/src/)
记不住先 -n 演练。
常用模板
简单备份
rsync -avz --progress /home/wadely/data/ user@backup:/backups/data/
镜像同步(双向一致)
rsync -avz --delete src/ dest/
# 目标里没有的源里有 → 复制过去
# 源里没有的目标里有 → 删除
排除模式
rsync -avz \
--exclude='node_modules' \
--exclude='*.log' \
--exclude='.git' \
src/ user@host:/dest/
或写到文件里:
cat > .rsyncignore <<EOF
node_modules
*.log
.git
EOF
rsync -avz --exclude-from='.rsyncignore' src/ user@host:/dest/
带备份的同步(被覆盖的存到时间戳目录)
rsync -avz --delete --backup --backup-dir=old-$(date +%F) src/ dest/
部署 Web 站
npm run build
rsync -avz --delete \
--exclude='node_modules' --exclude='.git' \
./ user@server:/var/www/site/
限速 / 自定义端口
rsync -avz --bwlimit=1000 src/ host:/dest/ # 限速 1000 KB/s
rsync -avz -e "ssh -p 22022" src/ host:/dest/ # 自定义端口
--link-dest(穷人版快照)
每次备份用硬链接指向上次未变文件——空间几乎不增长:
DATE=$(date +%F)
PREV=$(ls -t /backups/ | head -1)
rsync -avz --delete \
--link-dest=/backups/$PREV \
/data/ /backups/$DATE/
每天看着像完整备份,未变文件磁盘上只存一份。
远端到远端不行
# ❌ rsync 不支持
rsync -av user1@host1:/path user2@host2:/path
要么经本地中转,要么在某台机器 ssh 到对方拉。
坑
- 跨平台时权限保留可能失败(如 NTFS / FAT 没 Unix 权限)—— 加
--no-perms或-z --delete是危险的——-n演练再上- 大量小文件时 rsync 启动慢(建索引)——大文件单独传更快