rsync 是 Linux/Unix 下的本地/远程文件同步工具,杀手锏是增量同步——只传输文件变化部分。是日常备份、代码发布、文件迁移的标配。

核心优势

  • 比 cp/scp 快 N 倍,节省带宽
  • 支持断点续传、保留权限/时间戳/链接
  • 支持镜像同步(双端完全一致)

安装

sudo apt install rsync -y       # Debian/Ubuntu
sudo yum install rsync -y       # CentOS/RHEL
brew install rsync              # macOS(默认带,但 brew 版本更新)

基础语法

# 本地同步
rsync [选项] 源 目标
 
# 远程推送(本地 → 服务器)
rsync [选项] 本地源 用户@主机:远程目标
 
# 远程拉取(服务器 → 本地)
rsync [选项] 用户@主机:远程源 本地目标

90% 新手必踩的坑:源末尾的 /

写法同步逻辑例子
rsync /data/ /backup/同步目录里的内容,不包含目录本身/data/*/backup/
rsync /data /backup/同步整个目录/backup/ 中创建 data/

不确定时,先加 -n 干跑看效果。

必用参数

参数含义必用场景
-a归档模式(=-rlptgoD),保留所有属性 + 递归几乎所有场景
-v详细输出调试/确认范围
-h人类可读单位(KB/MB/GB)必加
-z传输时压缩远程同步
-P--partial --progress 断点续传 + 进度大文件、网络不稳
-n干跑,不实际执行--delete 前必加测试
--delete删除目标目录中源没有的文件(镜像同步)备份、发布需双端一致时
--exclude=PAT排除模式跳过 .git*.log

高频实战命令

# 本地全量备份
rsync -avh /data/project/ /backup/project/
 
# 远程推送(代码发布)
rsync -azvhP ./ root@192.168.1.100:/var/www/html/
 
# 自定义 SSH 端口
rsync -azvhP -e 'ssh -p 2222' ./ root@host:/var/www/html/
 
# 远程拉取
rsync -azvhP root@host:/backup/mysql/ /local/backup/
 
# 镜像同步(先 -n 测试再执行!)
rsync -azvhP --delete -n ./ root@host:/var/www/html/   # 测试
rsync -azvhP --delete    ./ root@host:/var/www/html/   # 执行
 
# 排除规则
rsync -azvhP --exclude='.git/' --exclude='*.log' --exclude='runtime/' \
      ./ root@host:/var/www/html/
 
# 排除文件清单
rsync -azvhP --exclude-from=exclude.list ./ root@host:/var/www/html/

免密同步(推荐配置)

ssh-keygen                                # 一路回车
ssh-copy-id root@192.168.1.100            # 默认 22
ssh-copy-id -p 2222 root@192.168.1.100    # 自定义端口

避坑

  • 源目录末尾 / 与否决定行为,不确定就加 -n
  • --delete 高危,必须先 -n 测试
  • -a 不会跟随软链接源文件;如需跟随用 -aL
  • 路径含空格须用双引号:rsync -avh "/data/my project/" "/backup/my project/"
  • 远程用户必须对目标目录有写权限

万能模板

# 本地
rsync -avh 源/ 目标/
 
# 远程
rsync -azvhP 源/ user@host:目标/
 
# 镜像(先 -n 测试)
rsync -azvhP --delete -n 源/ user@host:目标/