我最近嘗試了 cp 命令,並注意到以下內容:
假設我們有一個資料夾foo
,其中包含文件bar
和符號連結l-bar
:
foo
|-- bar
|-- lbar -> bar
lbar
當使用預設值複製時cp lbar copy-lbar
,我們得到
foo
|-- bar
|-- copy-lbar
|-- lbar -> bar
其中copy-lbar
是常規文件,包含bar
.copy-lbar
不以任何方式連結到bar
或lbar
。當使用cp -r lbar copy-lbar-recursive
替代方法時,我們得到以下結果:
foo
|-- bar
|-- copy-lbar
|-- copy-lbar-recursive -> bar
|-- lbar -> bar
現在,就像 一樣lbar
,copy-lbar-recursive
代表原始文件的連結bar
。
但為什麼要更改連結複製方式-r, --recursive
的選項呢? 兩者的和只是將其標記為cp
help
manual
cp
“遞歸複製目錄”。
內部發生了什麼-r
對符號連結有不同的影響?
答案1
完整的GNU 文檔(但不是 Debian 線上說明頁,例如),描述如下行為
從符號連結複製時,cp 通常僅在不遞歸複製或使用
--link
( )時才遵循連結。此預設值可以用( )、、( )、( ) 和選項-l
覆寫。--archive
-a
-d
--dereference
-L
--no-dereference
-P
-H
它還寫道,
'
--recursive
' 遞歸複製目錄。預設情況下,除非與--link
(-l
) 選項一起使用,否則不要遵循原始程式碼中的符號連結[...]
使用 -r 複製符號連結或特殊檔案是不可移植的。 [...]
此外,除非您也指定 -P,否則使用 -R 複製符號連結是不可移植的,因為 POSIX 允許預設取消引用符號連結的實作。
因此,為了直接回答您的問題,行為如所描述的那樣,以便維護與 POSIX 的預設行為相容性元素。