![Linux“cp”复制符号链接而不是目标文件](https://linux22.com/image/143530/Linux%E2%80%9Ccp%E2%80%9D%E5%A4%8D%E5%88%B6%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E8%80%8C%E4%B8%8D%E6%98%AF%E7%9B%AE%E6%A0%87%E6%96%87%E4%BB%B6.png)
在我的目录中,有 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