符號連結上的 cp 與 cp -r

符號連結上的 cp 與 cp -r

我最近嘗試了 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不以任何方式連結到barlbar。當使用cp -r lbar copy-lbar-recursive替代方法時,我們得到以下結果:

foo
|-- bar
|-- copy-lbar
|-- copy-lbar-recursive -> bar
|-- lbar -> bar

現在,就像 一樣lbarcopy-lbar-recursive代表原始文件的連結bar

但為什麼要更改連結複製方式-r, --recursive的選項呢? 兩者的和只是將其標記為cp
helpmanualcp“遞歸複製目錄”
內部發生了什麼-r對符號連結有不同的影響?

答案1

完整的GNU 文檔(但不是 Debian 線上說明頁,例如),描述如下行為

從符號連結複製時,cp 通常僅在不遞歸複製或使用--link( )時才遵循連結。此預設值可以用( )、、( )、( ) 和選項-l覆寫。--archive-a-d--dereference-L--no-dereference-P-H

它還寫道,

'--recursive' 遞歸複製目錄。預設情況下,除非與--link( -l) 選項一起使用,否則不要遵循原始程式碼中的符號連結[...]

使用 -r 複製符號連結或特殊檔案是不可移植的。 [...]

此外,除非您也指定 -P,否則使用 -R 複製符號連結是不可移植的,因為 POSIX 允許預設取消引用符號連結的實作。

因此,為了直接回答您的問題,行為如所描述的那樣,以便維護與 POSIX 的預設行為相容性元素。

相關內容