远程文件同步神器,Linux/macOS 原生自带,Windows 可用 cwRsync 或 WSL。

一、基础概念

rsync = remote sync,核心特点:

  • 增量传输 — 只传变动的部分,第二次基本秒传
  • 保留属性 — 权限、时间戳、软链接、所有者可选保留
  • 压缩传输 — 传输时自动压缩,省带宽
  • 支持删除 — 源端删了,目标端也删

二、最常用命令

本地同步

rsync -av /source/dir/ /target/dir/

注意末尾斜杠!

  • /source/dir/ → 传里面的内容
  • /source/dir → 把整个文件夹(含文件夹本身)传过去

远程同步(SSH)

# 本地上传到远程
rsync -av /local/path/ user@remote:/remote/path/

# 远程下载到本地
rsync -av user@remote:/remote/path/ /local/path/

带删除的完全同步(镜像)

rsync -av --delete /source/dir/ /target/dir/
源端有的目标有,源端没有的删除,完全一致。

三、核心参数速查

参数全称作用
-a--archive归档模式 = -rlptgoD(注意:不含 -H-A-X
-A--acls保留 ACL 访问控制列表(不在 -a
-X--xattrs保留扩展属性(不在 -a
-v--verbose显示详细传输过程
-q--quiet静默模式,减少输出
-h--human-readable以人类可读格式显示文件大小(如 1.5M2G
-z--compress传输时压缩数据,省带宽
--compress-level=N 设置压缩级别 1-9(默认 6)
-r--recursive递归子目录
-R--relative保留完整相对路径(如 /foo/bar.c 会在目标创建完整路径)
-l--links保留软链接(不加则默认跳过所有软链接)
-L--copy-links将软链接转为指向的实际文件/目录
-H--hard-links保留硬链接(不在 -a,备份场景建议手动加)
-p--perms保留权限
-t--times保留修改时间
--omit-dir-times 不保留目录的修改时间(解决目标无写权限报错)
-g--group保留组信息
-o--owner保留所有者(需要 root)
-D--devices --specials保留设备文件和特殊文件(设备文件需 root)
-S--sparse高效处理稀疏文件
-x--one-file-system不跨越文件系统边界(备份时防止进入挂载点)
-c--checksum以 checksum 判断文件是否变化,替代默认的 size+modtime
-u--update只更新,不覆盖目标端比源端更新的文件
-I--ignore-times忽略 size+time 快速检查,强制重新评估所有文件
--ignore-existing 跳过目标端已存在的文件(不论内容是否变化)
--size-only 仅用文件大小判断变化,忽略时间戳
-@--modify-window时间戳容差窗口(秒),默认 0
-C--cvs-exclude自动排除 CVS 常用忽略文件
-W--whole-file整文件拷贝,不使用增量算法(本地复制可提速)
-n--dry-run模拟运行,只看不传
--progress 显示实时进度
-P--partial --progress断点续传 + 显示进度
--partial-dir=DIR 将部分传输文件放入指定目录(而非默认隐藏文件)
--delay-updates 延迟更新到传输结束再统一移动(原子性更好)
--inplace 直接写入目标文件,不创建临时文件
--append 追加数据到文件末尾(适合日志文件,需保证数据一致)
--delete 删除目标端有但源端没有的文件
--delete-excluded 同时删除目标端被排除规则过滤掉的文件
--delete-before 传输前先删除目标端多余文件
--delete-during 传输过程中边传边删(默认行为)
--delete-after 传输完成后再删除目标端多余文件
--delete-delay 延迟删除到传输结束(推荐替代 --delete-after
--max-delete=N 最多删除 N 个文件,超出则报错终止(防误删)
--prune-empty-dirs 传输后删除目标端的空目录
--existing 只更新目标端已存在的文件,不新建
--remove-source-files 传输成功后删除源端文件(实现"移动"效果)
--backup / -b 覆盖前备份旧文件
--backup-dir=DIR 将备份的旧文件放入指定目录
--suffix=SUFFIX 自定义备份后缀(默认 ~
--link-dest=DIR 增量备份:未变化的文件硬链接到 DIR 中已有文件
--compare-dest=DIR 对比 DIR,只传 DIR 中没有或不同的文件
-T--temp-dir=DIR在 DIR 中创建临时文件
--bwlimit=KBPS 限速 KB/s
--timeout=SECONDS I/O 超时时间(秒),无数据传输则断开
--contimeout=SECONDS 连接超时时间(秒)
-e--rsh指定远程 shell,如 ssh
--rsync-path=PATH 指定远程 rsync 可执行文件路径
-4 / --ipv4 强制使用 IPv4
-6 / --ipv6 强制使用 IPv6
--port=PORT 指定 rsync daemon 端口(默认 873)
--password-file=FILE 从 FILE 读取密码(自动化脚本用)
--numeric-ids 不映射 uid/gid 为用户名/组名(跨系统同步建议加)
--log-file=FILE 将日志输出到指定文件
--itemize-changes / -i 显示每个文件的变化标记(如 >f 表示文件传输)
--stats 传输结束后显示统计摘要
--exclude='*.log' 排除特定文件
--exclude-from='list.txt' 从文件读取排除列表
--include='*.pdf' 只包含特定文件
--files-from=FILE 从 FILE 读取源文件列表(只传列出的文件)
--min-size / --max-size 只传输大于/小于指定大小的文件
--out-format=FORMAT 自定义输出格式

四、常用组合

1. 标准归档同步(最常用)

rsync -avz /source/ /target/

2. 完全镜像(一模一样)

rsync -avz --delete /source/ /target/

3. 带进度、断点续传、限速

rsync -avzP --bwlimit=5000 /source/ user@remote:/target/

4. 排除日志和临时文件

rsync -avz --exclude='*.log' --exclude='*.tmp' --exclude='.git/' /source/ /target/

5. 模拟运行先看效果

rsync -avz --delete --dry-run /source/ /target/
确认无误后去掉 --dry-run 正式执行。

6. 指定非默认SSH端口

rsync -avz -e 'ssh -p 2222' /source/ user@remote:/target/

7. 只同步某些类型文件

rsync -avz --include='*.pdf' --include='*.docx' --exclude='*' /source/ /target/
注意 --exclude='*' 要放最后,先 include 再 exclude。

8. 快速清空/删除目录内所有文件

用空目录覆盖目标目录,比 rm -rf 更可控:

mkdir /tmp/empty
rsync -a --delete /tmp/empty/ /path/to/target_dir/
源端为空,--delete 会把目标端多出来的文件全部删除,实现快速清空。比 rm 快得多,尤其适合海量小文件。

9. 增量备份(硬链接未变文件)

rsync -av --link-dest=/backup/yesterday/ /source/ /backup/today/
未变化的文件会硬链接到 yesterday 的对应文件,只占用一份磁盘空间。适合每日备份保留多份快照。

10. 从文件列表批量同步

rsync -av --files-from=list.txt /source/ /target/
list.txt 每行一个相对路径,只同步列出的文件。

11. 追加日志文件(不断开服务)

rsync -av --append /source/log/ user@remote:/backup/log/
--append 只追加新增数据到文件末尾,适合日志类持续增长的文件。

12. 安全删除 + 延迟删除

rsync -av --delete-delay --max-delete=100 /source/ /target/
--delete-delay 等传输完再统一删除,更安全;--max-delete 限制最多删 100 个,防止误删灾难。

13. 大目录同步 + 超时 + 排除系统目录

time rsync -avh --delete --stats --progress --timeout=300 --exclude='.minio.sys' /source/path/ /target/path/
time 统计总耗时;--timeout=300 设置 5 分钟 I/O 超时,无数据传输则重连;--exclude='.minio.sys' 排除 MinIO 系统目录;--stats 结束后显示详细统计。

创建 exclude-list.txt

*.log
*.tmp
node_modules/
.git/
.cache/
Thumbs.db
desktop.ini

使用:

rsync -avz --exclude-from='exclude-list.txt' /source/ /target/

六、常见问题

同步后目标端权限变了?

-a 参数保留权限,或用 -p 单独保留。

用了 -a 但不想保留某个属性怎么办?

--no-OPTION 关闭 -a 中的某个选项,无需手动拆分:

rsync -a --no-o --no-g /source/ /target/   # 不保留所有者和组
rsync -a --no-perms /source/ /target/      # 不保留权限

如何查看每个文件具体发生了什么变化?

-i--itemize-changes),输出每文件的变化标记:

rsync -avi /source/ /target/

标记含义:>f 文件传输、cd 目录创建、.f 属性更新等。

目录时间戳报错/无法设置?

目标目录无写权限时,加 --omit-dir-times 跳过目录时间戳:

rsync -av --omit-dir-times /source/ /target/

跨系统同步用户ID不一致?

--numeric-ids 直接传输数字 uid/gid,不做用户名映射:

rsync -av --numeric-ids /source/ user@remote:/target/

如何只传大于 100M 或小于 1K 的文件?

--min-size / --max-size

rsync -av --min-size=100M --max-size=1G /source/ /target/

软链接没同步过去?

rsync 默认跳过所有软链接,不加参数时看到 "skipping non-regular" 是正常的。-a 已包含 -l(保留软链接),如没加 -a 需手动加 -l。如果加了仍没保留,检查目标系统是否支持软链接(如 FAT32/exFAT 不支持)。

硬链接没保留?

-a 不包含 -H(硬链接),备份场景需手动加:

rsync -avH /source/ /target/

怎么只传新增/修改的文件?

rsync 默认就是增量,第二次会自动跳过已存在的文件。想跳过目标端已存在的(不论是否变化):

rsync -avz --ignore-existing /source/ /target/

想不覆盖目标端比源端更新的文件:

rsync -avz -u /source/ /target/

传输太慢怎么提速?

  • 局域网去掉 -z(压缩反而拖慢)
  • 本地复制加 -W--whole-file,跳过增量比对,直接整文件拷贝)
  • --inplace 减少临时文件操作
  • 检查是否大量小文件,考虑打包后传
  • --stats 查看详细统计,定位瓶颈

怎么显示传输速度?

--progress-P

八、参考

标签: none