rsync 如何保留源目录的完整路径结构?
rsync -av 源/ 目标/ 保留内部结构;要在目标侧重建完整路径(含源路径本身)用 -R(--relative),配 --no-implied-dirs 等微调。尾斜杠决定"目录本身"还是"内容"。本文讲清规则。
两个层面的"保留路径":①目录内部结构保留——rsync -av 即可(archive 模式递归保留权限、软链等);②把源的完整路径**(如 /home/a/b/c)在目标侧原样重建——加 -R(--relative)。源路径结尾的斜杠决定拷"目录里的内容"还是"目录本身",是 rsync 最重要的细节。**
基础:保留内部结构
rsync -av /data/projects/ /backup/projects/
/data/projects/ 里的层级、权限、软链原样进 /backup/projects/。-a = -rlptgoD 的组合(递归、软链、权限、时间、属主、设备文件)。
关键细节:尾斜杠
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 root@host1:/var/log/./nginx/ /central-logs/host1/
常用组合
rsync -avR --delete 源/./路径/ 目标/ # 镜像同步(目标多出的文件会删)
rsync -avR --exclude='*.tmp' 源/ 目标/ # 排除
rsync -avzR -e ssh 源/ user@host:/目标/ # 远程+压缩
观测云对照
集中采集目录用 rsync 汇总后,观测链路一处接入。 多机日志 rsync 到汇总机后,DataKit 单点采集即可;不过更推荐每台机器直接装 DataKit 直采——少一跳、实时性更好、机器上下线不用改同步拓扑。
常见问题(FAQ)
Q:-a 和 -R 冲突吗?
A:不冲突,常一起用:-a 管文件属性,-R 管路径重建。
Q:目标侧多余文件想删掉?
A:加 --delete(先 -n 干跑确认清单,防误删)。
Q:跨机器保留属主数字 ID 不一致?
A:-a 默认按名字映射属主,名字对不上会退化成数字;两边账号体系不同时考虑 --numeric-ids。