cp -L与cp -H


45

问题

使用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!

此处的答案将这两个选项描述为与结合使用时类似的UNLESS -R。不适合我。软链接文件和硬链接文件将成为它们指向源文件的重命名副本。
 

问题

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


  我试图解决的问题man cp告诉我两种选择都完全相同,但是info cp措辞使我更加困惑。也许可以帮我分解一下:

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

这听起来像是我的矛盾:我猜想» 符号链接的性质 «是指向某处…

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

我确实知道符号链接不是常规文件,但是...我承认我对这里的解释充满了挑战。


运行info cp,搜索-R。它说,Copy directories recursively. 但是您正在测试非目录。区别在于要复制的目录内部内容,而不是命令行参数。
Mikel 2013年

@Mikel我尝试复制目录的内容并复制包含内容本身的目录,并且得到了完全相同的结果。另外:我在前面坐了很长时间,info cp努力弄清楚此选项中的单词选择实际上意味着什么– 以及该帖子的内容。该帖子还包含来自的实际用语info cp-因此,我必须至少打开它...;)
erch 2013年

Answers:


55

使用符号链接,工具可以执行以下两项操作:

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

-H“保留其性质”并不是矛盾。考虑替代方案。如果使用-Lcp则将打开所有符号链接查找,并将其内容复制到目标文件名。因此,源是符号链接,但其副本不是符号链接。因此,它“失去了作为符号链接的性质”。

考虑

$ 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  

很好的答案-我喜欢您说明选项的用途的方式。它并不能完全回答我的问题,这是关于将符号链接复制到同级目录,但是您已经很清楚地知道如何进行快速实验以找出答案。😉
迈克尔Scheper

1
啊,原来我真正想知道的是:superuser.com/a/138594/219388
Michael Scheper

19

在行为上的差异之间-L-H当谈到-r被指定为好。 cp不会在的子目录中创建符号链接,-L -r但如果您使用,则会创建符号链接-H -r


cp:-H,-L和-P选项不能与-r选项一起指定。
3z33etm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.