Symlink

cp 命令在目的地和clobbers 連結目標處遵循符號連結,而不是覆蓋連結

  • May 26, 2022

我有一個符號連結,sd/common.py -> actual_file我想用生成的文件替換連結。

然而,每當我這樣做

cp /tmp/Star_Wrangler/common.py sd/common.py

…它複製/tmp/Star_Wrangler/common.py並覆蓋了,actual_file而不是像我想要的那樣替換符號連結。每次我忘記在複製之前刪除符號連結時,這種情況都會不斷發生。

是否可以選擇獲得我期望的行為?我查看了手冊,但它們都在源處而不是目標處談論符號連結。

這取決於您使用的是什麼 Unix。

在某些 BSD 系統(OpenBSD、FreeBSD)上,您會發現cp -f將取消連結(刪除)符號連結並將其替換為原始碼。

使用 GNU cp,這不會產生相同的效果,您需要使用 long 選項--remove-destination

在 macOScp -c上,如手冊所述,用於“使用”複製文件clonefile(2)

在 NetBSD 上,使用cp -a(“歸檔模式”,與cp -RpP該系統上相同)。這在 GNU、macOS、OpenBSD 或 FreeBSD 上不起作用,即使所有這些系統都有相同或相似的-a選項cp(在 GNU 系統上,它與 相同-dR --preserve)。

您自己已經提到了這一點:在復製文件之前刪除連結將解決問題。該rm實用程序刪除連結而不是連結引用的文件。這也是用正常文件替換符號連結的最便攜方式。

如果您正在編寫腳本,那麼我建議您使用rm後跟cp.

如果您正在互動工作並且一直忘記這樣做,那麼您也很可能忘記在cp這些情況下使用特定選項。

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