Linux“cp”复制符号链接而不是目标文件

Linux“cp”复制符号链接而不是目标文件

在我的目录中,有 2 个文件:一个文本文件和一个指向该文本文件的符号链接。

base_v21.txt -> base_v001.txt
base_v001.txt

当我尝试base_v001.txt使用以下命令进行复制时:

# cp base_v001.txt /targetdir

不是base_v001.txt被复制,而是base_v21.txt被复制。

# ls /targetdir
base_v21.txt

因此,即使我通过完整文件名指定要复制的文件,符号链接也会被复制。

我看过有关使用-L-H取消引用符号链接的帖子,但这并不真正适用于我的情况,因为我正在尝试复制目标文件本身;不是符号链接。

至于为什么符号链接和目标文件位于同一目录中,我无法控制。

答案1

尝试这个,

令目的地为/tmp/

如果您想复制目标文件而不是symlink, :

readlink -ne base.txt | xargs -0 cp -t /tmp/

答案2

获取符号链接目标的最简单方法是使用以下-L选项:

-L, --dereference 始终遵循 SOURCE 中的符号链接

这个命令实现了你的目标:

cp -L base_v001.txt /targetdir

答案3

如果未给出新文件名,则复制到目录会在目标目录中创建一个与源文件同名的新文件。因此以下命令将给出相同的输出:

> cp base_v21.txt /targetdir
> cp base_v21.txt /targetdir/base_v21.txt

它们会在源目录中创建一个名为“base_v21.txt”的新文件,其中包含该文件的内容。在本例中,由于符号链接,这些是“base_v001.txt”的内容。本质上,您正在执行以下操作:

> cat base_v21.txt >> /targetdir/base_v21.txt

因此,可以预期以下命令在复制后会给出相同的结果:

> cat base_v21.txt
> cat base_v001.txt
> cat /targetdir/base_v21.txt

您可以在以下示例中看到,硬链接或符号链接都会发生这种情况:

> touch base_v001.txt
> ln -s base_v001.txt base_v21.txt #create soft link
> cat "test" >> base_v001.txt
> mkdir dir
> cd dir
> cp ../base_v21.txt .
> ls
base_v21.txt

>cat base_v21.txt
test

> ln base_v001.txt base_v21.txt #create hard link
> cat "test" >> base_v001.txt
> mkdir dir
> cd dir
> cp ../base_v21.txt .
> ls
base_v21.txt

>cat base_v21.txt
test

答案4

确实,这是一种非常奇怪的行为。

检查并查看命令的别名有哪些冲突参数(如果有)cp。为此,请运行type命令。 (IE type cp

除此之外,您可以尝试使用替代实用程序执行操作,例如rsync它还支持处理符号链接(使用参数--links --copy-links--hard-links

相关内容