做什么

最强的文件同步工具——只传差异,带断点续传,能排除,能限速,能压缩。

基础

# 本地 → 远端
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/   # 自定义端口

每次备份用硬链接指向上次未变文件——空间几乎不增长:

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 启动慢(建索引)——大文件单独传更快