命令详解 rsync
rsync 用于本地或远程目录同步,能够基于文件差异减少重复传输。它会忠实执行参数:目标写错、方向写反或误用 --delete 都可能造成大范围数据丢失。重要数据先做独立备份,再使用 --dry-run 验证。
最容易踩坑:源路径末尾的斜杠
# 把 src 目录本身复制到 dest 下,形成 dest/src/...
rsync -a src dest/
# 只复制 src 目录中的内容到 dest/...
rsync -a src/ dest/
这两条命令结果不同。上线脚本前用小目录验证,并明确目标最终应出现的路径。
安全的执行顺序
# 1. 预演并显示变化
rsync -aHAXn --itemize-changes source/ destination/
# 2. 人工复核源、目标、排除项和删除项
# 3. 去掉 -n 后正式执行
rsync -aHAX --itemize-changes source/ destination/
-a 等价于归档模式的一组常用选项,但不包含硬链接 -H、ACL -A 和扩展属性 -X。是否需要这些元数据取决于文件系统、权限和恢复目标。
通过 SSH 远程同步
rsync -aHAX --info=progress2 -e 'ssh -p 22' \
/srv/data/ user@server:/srv/backup/data/
首次连接要核对 SSH 主机指纹。不要在脚本中明文写密码;使用受控密钥、最小权限账号和限制命令。远端也需要可用的 rsync,且双方版本和文件系统能力可能不同。
排除规则
rsync -an --itemize-changes \
--exclude='cache/' \
--exclude='*.tmp' \
source/ destination/
排除模式相对于传输根目录解释。规则复杂时使用 --exclude-from=FILE,并把规则文件纳入版本控制与评审。
谨慎使用 --delete
--delete 会删除目标中源端不存在的内容,使目标更像源端镜像。它不是“清理临时文件”的通用选项。
rsync -aHAXn --delete --itemize-changes source/ destination/
只有在 dry-run 输出经过审核、目标确为镜像且有可恢复备份时,才去掉 -n。可先使用 --max-delete=NUMBER 设置保护上限,或把即将删除的文件保留到备份目录:
rsync -a --delete --backup --backup-dir="../deleted-$(date +%F)" source/ destination/
增量快照式目录
--link-dest 可让未变化文件通过硬链接复用上一份快照的存储:
rsync -aHAX --delete \
--link-dest=/backup/previous \
/srv/data/ /backup/2026-10-17/
它要求目标文件系统支持硬链接,路径解析以目标端为准。必须定期执行恢复演练,不能仅凭目录存在就认为备份有效。
大文件与中断续传
rsync -a --partial --partial-dir=.rsync-partial --info=progress2 source/ destination/
--inplace 会直接修改目标文件,可能破坏快照、硬链接语义,也会让中断时留下不完整目标;除非明确理解后果,否则不作为默认项。
校验、时间戳和文件系统差异
- 默认快速检查主要依赖大小和修改时间;
--checksum会读取双方全部文件计算校验,成本较高。 - FAT、对象挂载、网络文件系统的时间精度、权限和符号链接能力可能不同。
- 跨平台同步前要测试文件名大小写、非法字符、稀疏文件、ACL、xattr 和所有者映射。
- root 运行会放大误操作影响,优先使用最小权限。
退出码与自动化
脚本必须检查 rsync 退出码,不能只看最后几行输出。部分文件消失、I/O 错误、权限不足或网络中断都可能导致非零状态。建议记录:开始时间、参数、源/目标、传输统计、退出码和告警,并对失败任务避免直接覆盖上一份可恢复备份。
同步不等于备份
同步可能把误删、勒索加密和损坏同步到目标。可靠备份还需要版本、隔离、保留策略、完整性校验和定期恢复演练。