
問題
當使用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 -H
and的正確用法是什麼cp -L
?這是預期的行為嗎?
我嘗試解決:
man cp
告訴我這兩個選項完全相同,但是info cp
's措詞讓我更加困惑。也許有人可以幫我分解一下:
-H
如果命令列參數指定符號鏈接,則複製它指向的文件而不是符號鏈接本身。然而,複製(保留其性質)任何符號鏈接這是透過遞歸遍歷遇到的。
這對我來說聽起來很矛盾:我想»符號連結的性質« 它指向某個地方...
-L, --dereference
從中複製時請遵循符號連結。使用此選項,cp
無法建立符號連結。例如,來源樹中的符號連結(到常規檔案)將被複製到目標樹中的常規檔案。
我確實知道符號連結不是常規文件,但是……我承認我對這裡的解釋感到過度挑戰。
答案1
透過符號鏈接,工具可以做兩件事:
- 將符號連結視為符號連結(「保留其性質」),或者
- 將符號連結視為它指向的檔案類型。
說-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
時出現。不會在子目錄中建立符號鏈接,但如果您使用.-r
cp
-L -r
-H -r