要用 rsync 展开软链接需用 -l 参数,它使 rsync 解析并复制链接指向的真实文件而非链接本身,跨分区和远程均适用,且覆盖 -a 中的 -l 行为;若链接目标不存在则报错跳过,除非加 --ignore-errors。

要用 rsync 在同步时把软链接“展开”成它指向的真实文件(即复制目标内容而非链接本身),关键参数是 -L(或 --copy-links)。
用 -L 参数展开软链接
默认情况下,rsync 会原样复制软链接文件(保留 link 结构)。加上 -L 后,rsync 会解析每个软链接,读取它指向的源路径,并把那个实际文件或目录复制到目标位置——相当于把符号链接“变成真身”。
- -L 不依赖文件系统位置:无论源和目标是否在同一分区,都能展开;跨分区、远程同步都适用
- -L 会覆盖 -l 的行为:即使你同时写了 -a(含 -l),只要加了 -L,软链接就一定被展开,不会保留为链接
- 注意路径有效性:如果软链接指向一个不存在的路径(如 /etc/nginx-stable 被删了),rsync 会报错并跳过该链接,除非配合 --ignore-errors
典型命令示例
比如源目录里有:/data/app → /opt/app-v2(一个软链接)
执行:
rsync -avL /data/ /backup/data/
结果:/backup/data/app/ 就是完整的 /opt/app-v2 目录副本,不再是链接。
搭配建议与注意事项
展开软链接常用于备份、归档或部署场景,但需留意以下几点:
- 目标空间可能显著增大(尤其多个软链接指向同一目录时,-L 会重复拷贝)
- 原始链接关系完全丢失,无法回溯原始结构
- 若只想对部分软链接展开,可用 --filter='merge /path/to/filter.rules' 配合 L 或 l 规则精细控制
- 硬链接不受 -L 影响;如需同时保留硬链接,请额外加 -H(但仅在同文件系统下有效)
对比:-a 和 -aL 的区别
-a:保留软链接为链接(/backup/app → /opt/app-v2)
-aL:复制软链接所指内容(/backup/app/ 就是 /opt/app-v2 的完整副本)
两者底层逻辑不同,不是“增强版”,而是互斥策略——选哪个取决于你是否需要保留链接语义。











