我最近尝试了 cp 命令,并注意到以下内容:
假设我们有一个文件夹foo
,其中包含文件bar
和符号链接l-bar
:
foo
|-- bar
|-- lbar -> bar
lbar
当使用默认值复制时cp lbar copy-lbar
,我们得到
foo
|-- bar
|-- copy-lbar
|-- lbar -> bar
其中copy-lbar
是常规文件,包含bar
.copy-lbar
不以任何方式链接到bar
或lbar
。当使用cp -r lbar copy-lbar-recursive
替代方法时,我们得到以下结果:
foo
|-- bar
|-- copy-lbar
|-- copy-lbar-recursive -> bar
|-- lbar -> bar
现在,就像 一样lbar
,copy-lbar-recursive
代表原始文件的链接bar
。
但为什么要更改链接复制方式-r, --recursive
的选项呢? 两者的和只是将其标记为cp
help
manual
cp
“递归复制目录”。
内部发生了什么-r
对符号链接有不同的影响?
答案1
完整的GNU 文档(但不是 Debian 联机帮助页,例如),描述了如下行为
从符号链接复制时,cp 通常仅在不递归复制或使用
--link
( )时才遵循链接。此默认值可以用( )、、( )、( ) 和选项-l
覆盖。--archive
-a
-d
--dereference
-L
--no-dereference
-P
-H
它还写道,
'
--recursive
' 递归复制目录。默认情况下,除非与--link
(-l
) 选项一起使用,否则不要遵循源代码中的符号链接[...]
使用 -r 复制符号链接或特殊文件是不可移植的。 [...]
此外,除非您还指定 -P,否则使用 -R 复制符号链接是不可移植的,因为 POSIX 允许默认情况下取消引用符号链接的实现。
因此,为了直接回答您的问题,该行为如所描述的那样,以便维护与 POSIX 的默认行为兼容性元素。