约 287245 字

约 1436 分钟

#Bash 的 rsync 命令

rsync [OPTION...] SRC... [DEST]
rsync [OPTION...] [USER@]HOST:SRC... [DEST]
rsync [OPTION...] SRC... [USER@]HOST:DEST
rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

功能

在本地或远程主机之间快速复制、同步文件和目录。rsync 使用增量传输算法,只传送源文件与目标文件之间的差异,常用于备份、镜像和日常文件复制。

类型

可执行文件(/usr/bin/rsync),属于 rsync 软件包。

参数

  • OPTION 选项:
    • 常用选项:
      • -a, --archive - 归档模式,等价于 -rlptgoD;不包含 -A、-X、-U、-N、-H
      • -v, --verbose - 增加详细输出;可重复使用
      • -q, --quiet - 抑制非错误消息
      • -n, --dry-run - 试运行,只显示将要执行的操作,不实际修改文件
      • -c, --checksum - 根据校验和判断文件是否变化,而不是大小和修改时间
      • -u, --update - 跳过目标端修改时间更新的文件
      • --existing, --ignore-non-existing - 不创建目标端不存在的新文件
      • --ignore-existing - 不更新目标端已存在的文件
      • -I, --ignore-times - 不跳过大小和修改时间都相同的文件
      • --size-only - 仅根据文件大小判断是否需要传输
      • --modify-window=NUM - 设置修改时间比较的容差;默认为 0
      • -W, --whole-file - 整文件复制,不使用增量传输算法
      • --inplace - 直接更新目标文件,而不是先写临时文件再替换
      • --append - 将数据追加到目标端较短的文件末尾
      • --append-verify - 类似 --append,但会校验文件中的旧数据
      • --partial - 传输中断时保留已传输的部分文件
      • --partial-dir=DIR - 将部分传输的文件放入 DIR
      • -P - 等价于 --partial --progress
      • --delay-updates - 所有更新文件在传输结束时统一放入目标位置
      • -y, --fuzzy - 目标文件不存在时,寻找相似文件作为增量传输的基础
      • --compare-dest=DIR - 如果文件在 DIR 中完全相同,则不传输
      • --copy-dest=DIR - 类似 --compare-dest,但会从 DIR 本地复制未变化的文件
      • --link-dest=DIR - 类似 --copy-dest,但未变化的文件以硬链接方式创建
      • --remove-source-files - 传输成功后删除源端的非目录文件
      • -b, --backup - 覆盖或删除目标文件前先备份
      • --backup-dir=DIR - 将备份文件放入 DIR;隐含 --backup
      • --suffix=SUFFIX - 设置备份文件后缀;默认 ~
      • -m, --prune-empty-dirs - 从文件列表中删除空目录链
      • --max-size=SIZE - 不传输大于 SIZE 的文件
      • --min-size=SIZE - 不传输小于 SIZE 的文件
      • --max-delete=NUM - 最多删除 NUM 个文件;0 表示只警告不删除
    • 递归与路径:
      • -r, --recursive - 递归复制目录
      • -d, --dirs - 传输目录本身但不递归其内容;目录名以 / 结尾时也会传输其直接内容
      • -R, --relative - 保留命令行中指定的相对路径
      • --no-implied-dirs - 使用 --relative 时不发送隐含目录
      • --mkpath - 创建目标路径中所有缺失的目录
      • -x, --one-file-system - 不跨越文件系统边界;重复使用可省略挂载点目录
    • 删除控制:
      • --delete - 删除目标端多余的文件;只对正在同步的目录生效
      • --delete-before - 传输开始前删除
      • --delete-during, --del - 传输过程中删除;默认
      • --delete-delay - 传输过程中计算,传输结束后删除
      • --delete-after - 传输结束后删除
      • --delete-excluded - 同时删除目标端被排除的文件
      • --ignore-errors - 即使发生 I/O 错误也继续删除
      • --force - 目标端的非空目录被非目录替换时强制删除
      • --ignore-missing-args - 忽略不存在的源参数,不报错
      • --delete-missing-args - 删除目标端对应的、源端已不存在的文件
    • 链接处理:
      • -l, --links - 将符号链接作为符号链接复制
      • -L, --copy-links - 跟随符号链接,复制其指向的文件或目录
      • --copy-unsafe-links - 仅跟随指向复制树外部的符号链接
      • --safe-links - 忽略指向复制树外部的符号链接
      • --munge-links - 对符号链接值进行转义,使其在目标端不可直接使用
      • -k, --copy-dirlinks - 将指向目录的符号链接视为真实目录
      • -K, --keep-dirlinks - 目标端指向目录的符号链接视为真实目录
      • -H, --hard-links - 保留硬链接关系
    • 文件属性:
      • -p, --perms - 保留权限
      • -E, --executability - 在未启用 --perms 时保留可执行属性
      • --chmod=CHMOD - 修改文件或目录权限;支持 D(目录)和 F(文件)前缀
      • -A, --acls - 保留 ACL;隐含 --perms
      • -X, --xattrs - 保留扩展属性
      • -o, --owner - 保留所有者;仅超级用户有效
      • -g, --group - 保留所属组
      • --devices - 保留设备文件;仅超级用户有效
      • --copy-devices - 将设备内容作为普通文件复制
      • --write-devices - 将设备作为文件写入;隐含 --inplace
      • --specials - 保留特殊文件
      • -D - 等价于 --devices --specials
      • -t, --times - 保留修改时间
      • -U, --atimes - 保留访问时间
      • --open-noatime - 打开文件时不改变访问时间
      • -N, --crtimes - 保留创建时间
      • -O, --omit-dir-times - 不保留目录的修改时间
      • -J, --omit-link-times - 不保留符号链接的时间
      • --super - 接收端尝试执行超级用户操作
      • --fake-super - 使用扩展属性保存和恢复特权属性
      • --numeric-ids - 直接使用数字 UID/GID,不进行用户/组名映射
      • --usermap=STRING - 自定义用户名映射
      • --groupmap=STRING - 自定义组名映射
      • --chown=USER:GROUP - 设置目标文件的用户和组
      • -S, --sparse - 将连续的空字节转换为稀疏块
      • --preallocate - 写入前为目标文件预分配空间
    • 过滤规则:
      • -f, --filter=RULE - 添加过滤规则
      • -F - 等价于 --filter='dir-merge /.rsync-filter';重复使用还会排除 .rsync-filter
      • --exclude=PATTERN - 排除匹配 PATTERN 的文件
      • --exclude-from=FILE - 从 FILE 读取排除模式
      • --include=PATTERN - 包含匹配 PATTERN 的文件
      • --include-from=FILE - 从 FILE 读取包含模式
      • --files-from=FILE - 从 FILE 读取要传输的文件列表
      • -0, --from0 - 使用空字符(\0)分隔 *-from 或过滤文件中的条目
      • -C, --cvs-exclude - 使用类似 CVS 的规则排除常见临时文件和版本控制目录
    • 压缩与传输:
      • -z, --compress - 传输时压缩文件数据
      • --compress-choice=STR, --zc=STR - 指定压缩算法:zstd、lz4、zlibx、zlib、none
      • --compress-level=NUM, --zl=NUM - 设置压缩级别
      • --skip-compress=LIST - 跳过列表中后缀的文件
      • -e, --rsh=COMMAND - 指定远程 Shell,例如 ssh -p 2222
      • --rsync-path=PROGRAM - 指定远程主机上运行的 rsync 程序
      • -B, --block-size=SIZE - 设置增量算法的校验块大小
      • --checksum-choice=STR, --cc=STR - 指定校验和算法
      • --timeout=SECONDS - 设置 I/O 超时时间
      • --contimeout=SECONDS - 设置守护进程连接超时时间
      • --bwlimit=RATE - 限制 socket 传输带宽;默认单位为 KiB/s,0 表示不限速
      • --stop-after=MINS - 运行指定分钟后停止
      • --stop-at=y-m-dTh:m - 在指定时间点停止
      • --fsync - 每写入一个文件后执行 fsync
      • --temp-dir=DIR, -T - 在 DIR 中创建临时文件
      • --protocol=NUM - 强制使用指定的旧协议版本
      • --iconv=CONVERT_SPEC - 在本地和远程字符集之间转换文件名
      • --checksum-seed=NUM - 设置校验和种子
      • --max-alloc=SIZE - 设置单次内存分配的上限
      • --address=ADDRESS - 绑定守护进程连接的本地地址
      • --port=PORT - 指定守护进程的端口
      • --sockopts=OPTIONS - 设置自定义 TCP 选项
      • --blocking-io - 对远程 Shell 使用阻塞 I/O
      • -4 - 优先使用 IPv4
      • -6 - 优先使用 IPv6
      • -M, --remote-option=OPTION - 仅向远程端传递选项
      • --copy-as=USER[:GROUP] - 以指定用户和组执行复制操作
      • -s, --secluded-args - 通过协议安全地发送参数;旧名称 --protect-args
      • --old-args - 使用旧的参数分割方式
      • --trust-sender - 信任远程发送方的文件列表,减少校验
    • 输出与日志:
      • --progress - 显示传输进度
      • --stats - 显示详细的传输统计信息
      • -i, --itemize-changes - 输出每个文件的变化摘要
      • --out-format=FORMAT - 自定义每个更新项的输出格式
      • --log-file=FILE - 将操作日志写入 FILE
      • --log-file-format=FMT - 自定义日志格式
      • -h, --human-readable - 以人类可读格式输出数字
      • -8, --8-bit-output - 输出时不转义高位字符
      • --info=FLAGS - 精细控制信息输出
      • --debug=FLAGS - 精细控制调试输出
      • --stderr=errors|all|client - 控制标准错误输出的模式
      • --outbuf=N|L|B - 设置输出缓冲模式:无缓冲、行缓冲或块缓冲
      • --no-motd - 不显示守护进程的 MOTD
      • --list-only - 只列出文件,不进行复制
      • -V, --version - 显示版本和编译信息
      • --help - 显示帮助;单独使用 -h 时也表示帮助
    • 批处理:
      • --write-batch=FILE - 将本次传输记录到批处理文件
      • --only-write-batch=FILE - 类似 --write-batch,但不更新目标端
      • --read-batch=FILE - 应用批处理文件中的更新
    • 守护进程相关:
      • --daemon - 以守护进程模式运行
      • --config=FILE - 指定 rsyncd.conf 配置文件
      • --dparam=OVERRIDE, -M - 覆盖守护进程的全局配置参数(守护进程模式下的 -M)
      • --no-detach - 不脱离终端,保持在前台运行
      • --password-file=FILE - 从 FILE 读取守护进程访问密码
      • --early-input=FILE - 向守护进程的 early exec 脚本发送最多 5 KiB 数据
  • SRC - 源文件、目录或远程路径
  • DEST - 目标文件、目录或远程路径

#示例

本地复制

$ tree src
src
├── a.txt
└── sub
    └── b.txt
$ mkdir dest1 dest2
$ rsync -av src dest1          # 复制目录本身,结果为 dest1/src
sending incremental file list
src/
src/a.txt
src/sub/
src/sub/b.txt
$ rsync -av src/ dest2         # 只复制目录内容,结果直接位于 dest2
sending incremental file list
a.txt
sub/
sub/b.txt
$ tree dest1 dest2
dest1
└── src
    ├── a.txt
    └── sub
        └── b.txt
dest2
├── a.txt
└── sub
    └── b.txt

试运行与删除

$ touch dest2/old.txt
$ rsync -avn --delete src/ dest2     # 先试运行,确认将要删除的内容
sending incremental file list
deleting old.txt
./
$ rsync -av --delete src/ dest2      # 确认无误后实际执行
sending incremental file list
deleting old.txt
./

通过 SSH 同步

$ rsync -avz src/ [email protected]:/backup/src/      # 推送到远程主机
$ rsync -avz [email protected]:/backup/src/ ./src/    # 从远程主机拉取
$ rsync -avz -e 'ssh -p 2222' src/ user@host:/backup/ # 指定 SSH 端口

压缩与限速

$ rsync -avz --bwlimit=1.5m src/ user@host:/backup/src/   # 压缩传输并限制为 1.5 MiB/s

显示进度与断点续传

$ rsync -avP bigfile.iso user@host:/backup/    # -P 等价于 --partial --progress
$ rsync -a --info=progress2 src/ dest/         # 显示整体传输进度
1,238,099 100%  146.38kB/s    0:00:08  (xfr#5, to-chk=169/396)

排除与只包含指定文件

$ rsync -av --exclude='*.log' --exclude='node_modules/' src/ dest/
$ rsync -av --include='*/' --include='*.txt' --exclude='*' src/ dest/
sending incremental file list
./
a.txt
sub/
sub/b.txt
  • 过滤规则按顺序匹配,第一条匹配的规则生效
  • 只包含某些文件时,通常需要先包含目录(--include='*/'),否则 rsync 不会进入被排除的目录

从文件列表同步

$ find src -type f > files.txt
$ rsync -av --files-from=files.txt ./ dest/
  • --files-from 隐含 --relative(-R)和 --dirs(-d)
  • 使用 --files-from 时,-a 不再隐含 -r,需要递归时请显式添加 -r
  • 列表中的路径相对于源目录,开头的 / 会被移除
  • 目标端会保留列表中的相对路径,例如列表中的 src/a.txt 会复制为 dest/src/a.txt

备份被覆盖的文件

$ rsync -av --backup --backup-dir=backup src/ dest/   # 备份到目标目录下的 backup/
$ rsync -av --backup --suffix=.bak src/ dest/         # 备份文件添加 .bak 后缀
  • --backup-dir 使用相对路径时,相对于目标目录
  • 未指定 --backup-dir 时,默认后缀为 ~

增量快照

$ rsync -av src/ backup-0/                              # 第一次完整备份
$ rsync -av --link-dest=../backup-0 src/ backup-1/      # 未变化的文件硬链接到上一次备份
$ stat -c '%i %n' backup-0/a.txt backup-1/a.txt
183 backup-0/a.txt
183 backup-1/a.txt
  • 两个文件的 inode 相同,说明它们是硬链接,不会额外占用数据块
  • --link-dest 要求文件的权限、所有者等被保留属性完全一致

校验和与大小比较

$ rsync -avc src/ dest/              # 使用校验和判断文件是否变化
$ rsync -av --size-only src/ dest/   # 仅根据大小判断是否需要传输
  • -c 需要读取双方文件内容,速度较慢,但适合时间戳不可靠的场景

保留权限与所有者

$ sudo rsync -av --chmod=D755,F644 src/ /srv/www/          # 目录 755,文件 644
$ sudo rsync -av --chown=www-data:www-data src/ /srv/www/  # 设置所有者和所属组

列出文件

$ rsync -av --list-only src/
sending incremental file list
drwxr-xr-x            100 2026/10/21 15:15:34 .
-rw-r--r--              8 2026/10/21 15:16:00 a.txt
drwxr-xr-x             60 2026/10/21 15:14:21 sub
-rw-r--r--              6 2026/10/21 15:14:21 sub/b.txt

保留相对路径

$ rsync -avR src/sub/b.txt reldest/       # 目标端保留 src/sub/b.txt 路径
$ rsync -avR src/./a.txt reldest/         # 从 . 之后开始保留,目标端为 a.txt
$ find reldest -type f | sort
reldest/a.txt
reldest/src/sub/b.txt

自动创建目标路径

$ rsync -av --mkpath src/a.txt dest/new/path/
sending incremental file list
a.txt
$ find dest/new/path -type f
dest/new/path/a.txt

使用 rsync 守护进程

$ rsync host::                                  # 列出守护进程提供的模块
$ rsync -av host::module/ /dest/                # 从守护进程拉取
$ rsync -av /src/ host::module/                 # 推送到守护进程
$ rsync -av rsync://host/module/src/ /dest/     # 使用 rsync:// URL

#相关命令

命令说明
cp复制文件或目录
find查找文件,结果可作为 --files-from 的输入
tar打包归档文件

#推荐阅读

#手册

更新: 2026/10/21

作者: planc

创建: 2026/10/21