rsync 使用速查手册
远程文件同步神器,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.5M、2G) |
-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。
八、参考
- 官网:https://rsync.samba.org
- 手册页:
man rsync - 在线文档:https://download.samba.org/pub/rsync/rsync.1