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

相關內容