Linux

cp -L 與 cp -H

  • October 12, 2016

問題

使用cp -Hor複製文件時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 -H和的正確用法是cp -L什麼?這是預期的行為嗎?

  我試圖解決的: man cp告訴我這兩種選擇都一樣,但是info cp’ 的措辭讓我更加困惑。也許有人可以幫我分解一下:

-H 如果命令行參數指定了符號連結,則複製它指向的文件而不是符號連結本身。但是,複製(保留其性質)通過遞歸遍歷遇到的任何符號連結

這對我來說聽起來很矛盾:我猜“符號連結的本質”是它指向某個地方……

-L, --dereference 從符號連結複製時遵循符號連結。使用此選項,cp無法創建符號連結。例如,源樹中的符號連結(到正常文件)將被複製到目標樹中的正常文件。

我確實知道符號連結不是正常文件,但是……我承認我對這裡的解釋感到過分挑戰。

使用符號連結,工具可以做兩件事:

  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  

引用自:https://unix.stackexchange.com/questions/94714