cp -P(或--no-dereference)可复制软链接本身而不跟随其指向目标;-L则强制跟随并复制实际内容;-a已内置-P,ln -s用于新建软链接而非复制。

Linux 中的 cp 命令本身不叫 “COPY 指令”,但常被理解为复制操作的核心工具。要正确复制软链接(符号链接)本身,而不是它指向的目标文件,关键在于控制是否“跟随链接”——默认行为是跟随,必须显式禁用。
明确区分:复制软链接本身 vs 复制它指向的内容
软链接是一个独立的小文件,只存路径字符串。复制时有两个目标:
- 想得到一个一模一样的新软链接(路径不变、类型不变)→ 需 不跟随 原链接
- 想得到原链接所指文件的一份副本(不管它是不是链接)→ 默认就会跟随
用 -P 参数保留软链接结构
-P(或 --no-dereference)告诉 cp:遇到软链接,别打开它,直接把它当普通文件复制。
- 单个软链接:
cp -P link1 new_link→new_link是和link1完全一致的新软链接 - 整个目录含软链接:
cp -rP dir1/ dir2/→ 目录内所有软链接都会被原样复制,不会变成真实文件 - 注意:
-a(归档模式)已内置-P,所以cp -a也能安全复制软链接
避免误用 -L 导致“展开”链接
-L(--dereference)的作用正好相反:强制跟随所有软链接,复制它们指向的实际内容。
- 比如
cp -L /usr/bin/java /root/java→ 复制的是 JDK 的真实二进制文件,不是链接 - 若源是软链接而你用了
-L,目标就不再是链接,而是普通文件,容易破坏原有结构 - 脚本或批量操作中尤其要检查是否误加了
-L
补充:创建新软链接用 ln -s,不是 cp
如果目的是新建一个指向相同目标的软链接(而非复制已有链接),应使用 ln -s:
ln -s /path/to/target new_link-
cp -P复制的是“链接文件本身”,ln -s创建的是“新链接关系” - 两者语义不同:前者保留原链接的路径上下文(比如相对路径),后者由你指定新路径


















