rsync 如何保留源目录的完整路径结构?

rsync -av 源/ 目标/ 保留内部结构;要在目标侧重建完整路径(含源路径本身)用 -R(--relative),配 --no-implied-dirs 等微调。尾斜杠决定"目录本身"还是"内容"。本文讲清规则。

最佳实践
rsync 如何保留源目录的完整路径结构?封面

两个层面的"保留路径":①目录内部结构保留——rsync -av 即可(archive 模式递归保留权限、软链等);②把源的完整路径**(如 /home/a/b/c)在目标侧原样重建——加 -R(--relative)。源路径结尾的斜杠决定拷"目录里的内容"还是"目录本身",是 rsync 最重要的细节。**

以下 /./ 锚点及相对路径示例按上游 rsync 3.x 说明;macOS 自带 openrsync 等实现可能行为不同,先用 rsync --version 和临时目录验证。

基础:保留内部结构

rsync -av /data/projects/ /backup/projects/

/data/projects/ 里的层级、权限、软链原样进 /backup/projects/。-a = -rlptgoD(递归、软链、权限、时间、组、属主、设备/特殊文件),不含 ACL、扩展属性和硬链接;实际保留还取决于权限和目标文件系统。

关键细节:尾斜杠

rsync -av /data/projects /backup/    # 目标得到 /backup/projects/(目录本身)
rsync -av /data/projects/ /backup/   # 目标得到 /backup/ 里直接是内容(不带 projects 层)

记住:源带斜杠 = 拷内容;不带 = 拷目录。

进阶:保留完整路径(-R)

把源路径的"目录链"也在目标侧重建:

rsync -avR /home/alice/documents/reports/ /backup/
# 目标得到 /backup/home/alice/documents/reports/...

/./ 锚点:只保留部分路径——

rsync -avR /home/alice/./documents/reports/ /backup/
# 只保留锚点之后:/backup/documents/reports/...

这是把多台机器的 /var/log/ 汇总到一台时不互相覆盖的标准技巧:

rsync -avR -e ssh logreader@host1:/var/log/./nginx/ /central-logs/host1/

常用组合

rsync -avR --delete 源/./路径/ 目标/     # 镜像同步(同步目录范围内接收端多余项可能删除,非整个目标无差别清空)
rsync -avR --exclude='*.tmp' 源/ 目标/   # 排除
rsync -avzR -e ssh 源/ user@host:/目标/  # 远程+压缩

常见问题(FAQ)

Q:-a 和 -R 冲突吗?
A:不冲突,常一起用:-a 管文件属性,-R 管路径重建。

Q:目标侧多余文件想删掉?
A:加 --delete 前先确认接收端路径与过滤规则,用 -n 干跑检查;正式运行前后的源/目标变化仍会改变删除清单。-R 和 /./ 也会改变过滤规则相对的传输根。

Q:跨机器保留属主数字 ID 不一致?
A:-a 默认按名字映射属主,名字对不上会退化成数字;两边账号体系不同时考虑 --numeric-ids。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台