Linux
cp -L 與 cp -H
問題
使用
cp -H
or複製文件時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
無法創建符號連結。例如,源樹中的符號連結(到正常文件)將被複製到目標樹中的正常文件。我確實知道符號連結不是正常文件,但是……我承認我對這裡的解釋感到過分挑戰。
使用符號連結,工具可以做兩件事:
- 將符號連結視為符號連結(“保留其性質”),或
- 將符號連結視為它指向的文件類型。
說
-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