什么是 rsync?

rsync(Remote Sync,远程同步)是 Linux 下最常用的文件与目录同步工具。

可以用一个通俗的比喻来理解它:

  • 普通的 cp(复制)或者 scp(远程拷贝)就像搬家:不管你改没改东西,每次都把整个屋子所有的箱子全部重新搬一次。

  • rsync 像智能记账员:它在传输前会先对比两边的文件,只传输修改过、新增的文件,甚至只传输一个大文件里被改动的几个字节(这叫增量同步)。如果两边文件一模一样,它直接跳过,速度极快且极其省带宽。

一、最核心的语法结构

无论是本地复制还是远程传输,语法规则都非常直观:

Bash

rsync [选项] 源路径 目标路径

最常用的万能参数组合:-avz

日常使用 90% 的场景只需要记住这一组组合参数:

  • -a(archive,归档模式):核心参数,相当于同时开启了保留文件权限、属主、修改时间、软链接,并且递归同步所有子目录。

  • -v(verbose,详细输出):在终端打印当前正在同步哪些文件。

  • -z(compress,压缩传输):传输数据时先压缩,适合跨网络同步,能显著节省带宽。

二、典型使用场景与命令

1. 本地目录同步(做本地备份)

把 /data/web/ 目录同步备份到 /backup/web/:

Bash

rsync -avz /data/web/ /backup/web/

2. 远程同步(推送到远程服务器)

把本地的配置或代码推送到远程服务器(基于 SSH,默认端口 22):

Bash

rsync -avz /data/web/ root@192.168.10.20:/data/web/

3. 远程拉取(从远程服务器下载备份)

把远程机器上的数据同步拉回到本地:

Bash

rsync -avz root@192.168.10.20:/data/web/ /backup/web/

三、初学者最容易踩的两个“大坑”

坑 1:源目录末尾带不带斜杠 /(完全不同!)

这是 rsync 设计上最容易让新手困惑的一点:

  • 带斜杠 /:代表“只同步目录里面的内容”。

    Bash

    rsync -avz /src/ /dst/
    # 结果:/dst/ 直接包含 a.txt, b.txt
    
  • 不带斜杠:代表“把整个目录连同名字一起同步过去”。

    Bash

    rsync -avz /src /dst/
    # 结果:/dst/ 下会生成一个 /dst/src/ 文件夹
    

坑 2:rsync 默认“只增不删”

如果本地删除了一个文件 test.txt,直接运行 rsync -avz 同步到目标机,目标机上的 test.txt 依然存在。

  • 如果需要两边完全镜像一致(本地删了什么,远端也跟着删什么),必须加上 --delete 参数:

    Bash

    rsync -avz --delete /src/ /dst/
    

    注意:使用 --delete 时务必确认源路径和目标路径没有填反,否则可能误删目标机上的数据。

四、防翻车技巧:模拟运行(Dry Run)

在执行包含 --delete 或大规模数据同步前,可以加上 -n(或 --dry-run):

Bash

rsync -avzn --delete /src/ /dst/

这个命令会完整模拟一次同步流程并打印出来,但不会在硬盘上改动任何真实文件。确认打印出来的文件变动符合预期后,去掉 -n 再正式执行。