rsync (remote sync) 是一个用于在本地或远程系统之间高效地同步文件和目录的工具。它的核心优势是使用“增量算法”,只传输源和目标之间有差异的部分,从而大大减少数据传输量。


1. 基本语法

rsync [选项] <源路径> <目标路径>
  • 源路径 (Source): 您要从中复制文件的地方。
  • 目标路径 (Destination): 您要将文件复制到的地方。
  • 源和目标都可以是本地路径,或者是 user@host:path 格式的远程路径。

一个非常重要的细节:源目录末尾的斜杠 /

  • rsync ... source/ destination: 表示将 source 目录里面的内容复制到 destination 目录中。
  • rsync ... source destination: 表示将 source 目录本身(连同文件夹一起)复制到 destination 目录中,最终路径会是 destination/source/
  • 通常,您想要的是第一种行为。

2. 常用选项 (Options)

这些选项可以组合使用,例如 -avh

  • -a, --archive (归档模式)

    • 这是最常用的选项,它是一个复合选项,相当于

      -rlptgoD

      ,包含了以下所有功能:

      • -r, --recursive: 递归地复制目录。
      • -l, --links: 保留符号链接。
      • -p, --perms: 保留文件权限。
      • -t, --times: 保留文件修改时间。
      • -g, --group: 保留文件的所属组。
      • -o, --owner: 保留文件的所有者 (仅在 root 用户下有效)。
      • -D, --devices --specials: 保留设备文件和特殊文件。
    • 简单来说,使用 -a 就能尽可能地让目标文件和源文件一模一样。

  • -v, --verbose (详细模式)

    • 显示更详细的输出,告诉您哪些文件正在被传输。
  • -h, --human-readable (人类可读格式)

    • 以 KB, MB, GB 等易于阅读的单位显示文件大小。
  • --progress (显示进度)

    • 每一个正在传输的文件显示详细的进度条、速度和剩余时间。对于传输大文件非常有用。
  • -n, --dry-run (演习模式)

    • 非常重要的安全选项! 它会模拟整个同步过程,详细列出它将会做的所有操作(复制、删除等),但实际上不会执行任何文件更改。是在执行一个有风险的命令前进行检查的最佳方法。
  • --delete (删除多余文件)

    • 有风险的强大选项! 这个选项会将在源目录中不存在,但在目标目录中存在的文件删除掉。这可以用来创建一个与源完全一致的镜像备份。使用前请务必配合 --dry-run 进行测试。
  • --exclude='PATTERN' (排除文件)

    • 排除掉符合某种模式的文件或目录。
    • 示例: --exclude='*.log' (排除所有 .log 文件),--exclude='tmp/' (排除 tmp 文件夹)。
  • --include='PATTERN' (包含文件)

    • --exclude 配合使用,用于更精细地控制包含/排除规则。
  • -z, --compress (压缩传输)

    • 在传输过程中对数据进行压缩,可以减少网络带宽占用。对于文本类文件效果很好,但对于已经压缩过的文件(如 .zip, .jpg)效果不大,反而会消耗更多 CPU。
  • -P

    • 这个选项相当于 --partial --progress--partial 允许 rsync 保留传输中断的文件,以便下次可以断点续传。

3. 常见用例

本地文件夹同步

source_folder 的内容同步到 backup_folder

rsync -avh --progress /path/to/source_folder/ /path/to/backup_folder/

上传到远程服务器 (Push)

将本地的 my_project 文件夹上传到服务器。

rsync -avh --progress ./my_project/ your_username@your_server_ip:~/projects/

从远程服务器下载 (Pull)

将服务器上的 remote_logs 文件夹下载到本地。

rsync -avh --progress your_username@your_server_ip:~/remote_logs/ ./local_logs/

创建镜像备份 (删除目标端多余文件)

让本地的 backup 文件夹与源文件夹 source_data 完全保持一致。

# 首先进行演习,检查哪些文件将被删除
rsync -avhn --progress --delete /path/to/source_data/ /path/to/backup/

# 确认无误后,去掉 -n 正式执行
rsync -avh --progress --delete /path/to/source_data/ /path/to/backup/

指定 SSH 端口和密钥

如果远程服务器使用非标准 SSH 端口或需要特定密钥。

# -e 选项用于指定远程 shell 命令
# 假设端口是 2222,密钥是 my_key.pem
rsync -avh --progress -e 'ssh -p 2222 -i /path/to/my_key.pem' ./source/ user@host:/dest/

rsync 是一个功能极其丰富的工具,掌握好 -avh --progress--delete--dry-run 这几个核心选项,就能满足绝大多数的文件同步需求。