Shell

cp 與符號連結上的 cp -r

  • June 2, 2021

我最近嘗試了 cp 命令,並註意到以下內容:

假設我們有一個文件夾foo,其中包含文件bar和符號連結l-bar

foo
|-- bar
|-- lbar -> bar

lbar使用預設值複製時cp lbar copy-lbar,我們得到

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

wherecopy-lbar是一個正常文件,包含bar. copy-lbar沒有以任何方式連結到baror lbar。改為使用時cp -r lbar copy-lbar-recursive,我們得到以下結果:

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

現在,就像lbarcopy-lbar-recursive表示到原始bar文件的連結。

但是為什麼-r, --recursive選擇cp更改連結複製方式的選項?

兩者的helpand只是manualcp其標記為*“遞歸複製目錄”*。

內部發生了什麼-r對符號連結有不同的影響?

完整的GNU 文件(例如,但不是 Debian 手冊頁)描述瞭如下行為

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

它還寫道,

--recursive’ 遞歸複製目錄。預設情況下,除非與--link( -l) 選項一起使用,否則不要跟隨原始碼中的符號連結

$$ … $$

使用 -r 複製符號連結或特殊文件是不可移植的。

$$ … $$

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

因此,為了直接回答您的問題,行為如所述,以保持與 POSIX 的預設行為兼容性元素。

引用自:https://unix.stackexchange.com/questions/652495