rsync 如何保留源目录的完整路径结构?
rsync -av 源/ 目标/ 保留内部结构;要在目标侧重建完整路径(含源路径本身)用 -R(--relative),配 --no-implied-dirs 等微调。尾斜杠决定"目录本身"还是"内容"。本文讲清规则。
两个层面的"保留路径":①目录内部结构保留——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。