cp -L 与 cp -H

cp -L 与 cp -H

问题

当使用cp -H或复制文件时cp -L,我得到相同的结果:

$ ls -l fileA
  fileA -> fileB
$ cp fileA somewhere/ -H
$ ls -l somewhere/
  fileA     # fileA is a copy of fileB, only renamed, with same properties!

这个答案在这里将这两个选项描述为相似的除非与 结合使用-R。不适合我。软链接文件与硬链接文件一样,会成为它们在源处指向的文件的重命名副本。
 

问题:

cp -Hand的正确用法是什么cp -L?这是预期的行为吗?


  我尝试解决: man cp告诉我这两个选项完全相同,但是info cp's措辞让我更加困惑。也许有人可以帮我分解一下:

-H 如果命令行参数指定符号链接,则复制它指向的文件而不是符号链接本身。然而,复制(保留其性质)任何符号链接这是通过递归遍历遇到的。

这对我来说听起来很矛盾:我想»符号链接的性质« 它指向某个地方......

-L, --dereference 从中复制时请遵循符号链接。使用此选项,cp无法创建符号链接。例如,源树中的符号链接(到常规文件)将被复制到目标树中的常规文件。

我确实知道符号链接不是常规文件,但是……我承认我对这里的解释感到过度挑战。

答案1

通过符号链接,工具可以做两件事:

  1. 将符号链接视为符号链接(“保留其性质”),或者
  2. 将符号链接视为它指向的文件类型。

-H“保留其本质”并不矛盾。考虑替代方案。如果您使用,则将打开找到的-L任何符号链接,并将其内容复制到目标文件名。cp所以源是一个符号链接,但它的副本不是符号链接。所以它“失去了符号链接的本质”。

考虑

$ mkdir subdir
$ echo "some contents" > subdir/file
$ ln -s file subdir/link

# definition of "list", the abbreviated ls -l output used below
$ list() { ls -l "$@" | \
    awk '$0 !~ /^total/ { printf "%s %s\t%s %s %s\n", $1, $5, $9, $10, $11 }' ; }

$ list subdir
-rw-rw-r-- 14   file  
lrwxrwxrwx 4    link -> file

$ cp -rH subdir subdir-with-H
$ list subdir-with-H
-rw-rw-r-- 14   file  
lrwxrwxrwx 4    link -> file

$ cp -rL subdir subdir-with-L
$ list subdir-with-L
-rw-rw-r-- 14   file  
-rw-rw-r-- 14   link  

答案2

-L和之间的行为差​​异也会在指定 -H时出现。不会在子目录中创建符号链接,但如果您使用.-rcp-L -r-H -r

相关内容