Shell
cp 與符號連結上的 cp -r
我最近嘗試了 cp 命令,並註意到以下內容:
假設我們有一個文件夾
foo
,其中包含文件bar
和符號連結l-bar
:foo |-- bar |-- lbar -> bar
lbar
使用預設值複製時cp lbar copy-lbar
,我們得到foo |-- bar |-- copy-lbar |-- lbar -> bar
where
copy-lbar
是一個正常文件,包含bar
.copy-lbar
沒有以任何方式連結到bar
orlbar
。改為使用時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
and只是manual
將cp
其標記為*“遞歸複製目錄”*。內部發生了什麼
-r
對符號連結有不同的影響?
完整的GNU 文件(例如,但不是 Debian 手冊頁)描述瞭如下行為
從符號連結複製時,cp 通常僅在不遞歸複製或使用
--link
(-l
) 時跟隨連結。--archive
可以使用(-a
)、-d
、--dereference
(-L
)、--no-dereference
(-P
) 和-H
選項覆蓋此預設值。它還寫道,
’
--recursive
’ 遞歸複製目錄。預設情況下,除非與--link
(-l
) 選項一起使用,否則不要跟隨原始碼中的符號連結$$ … $$
使用 -r 複製符號連結或特殊文件是不可移植的。
$$ … $$
此外,除非您還指定 -P,否則使用 -R 複製符號連結是不可移植的,因為 POSIX 允許預設取消引用符號連結的實現。
因此,為了直接回答您的問題,行為如所述,以保持與 POSIX 的預設行為兼容性元素。