符号链接上的 cp 与 cp -r

符号链接上的 cp 与 cp -r

我最近尝试了 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不以任何方式链接到barlbar。当使用cp -r lbar copy-lbar-recursive替代方法时,我们得到以下结果:

foo
|-- bar
|-- copy-lbar
|-- copy-lbar-recursive -> bar
|-- lbar -> bar

现在,就像 一样lbarcopy-lbar-recursive代表原始文件的链接bar

但为什么要更改链接复制方式-r, --recursive的选项呢? 两者的和只是将其标记为cp
helpmanualcp“递归复制目录”
内部发生了什么-r对符号链接有不同的影响?

答案1

完整的GNU 文档(但不是 Debian 联机帮助页,例如),描述了如下行为

从符号链接复制时,cp 通常仅在不递归复制或使用--link( )时才遵循链接。此默认值可以用( )、、( )、( ) 和选项-l覆盖。--archive-a-d--dereference-L--no-dereference-P-H

它还写道,

'--recursive' 递归复制目录。默认情况下,除非与--link( -l) 选项一起使用,否则不要遵循源代码中的符号链接[...]

使用 -r 复制符号链接或特殊文件是不可移植的。 [...]

此外,除非您还指定 -P,否则使用 -R 复制符号链接是不可移植的,因为 POSIX 允许默认情况下取消引用符号链接的实现。

因此,为了直接回答您的问题,该行为如所描述的那样,以便维护与 POSIX 的默认行为兼容性元素。

相关内容