我有一个符号链接,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
。在 macOS
cp -c
上,如手册所述,用于“使用”复制文件clonefile(2)
。在 NetBSD 上,使用
cp -a
(“归档模式”,与cp -RpP
该系统上相同)。这在 GNU、macOS、OpenBSD 或 FreeBSD 上不起作用,即使所有这些系统都有相同或相似的-a
选项cp
(在 GNU 系统上,它与 相同-dR --preserve
)。您自己已经提到了这一点:在复制文件之前删除链接将解决问题。该
rm
实用程序删除链接而不是链接引用的文件。这也是用常规文件替换符号链接的最便携方式。如果您正在编写脚本,那么我建议您使用
rm
后跟cp
.如果您正在交互工作并且一直忘记这样做,那么您也很可能忘记在
cp
这些情况下使用特定选项。符号链接具有非常令人困惑的行为,不仅是 with
cp
,而且还有chmod
,chown
以及例如内置的test
(或其[ .. ]
别名)。首先删除符号链接(
rm -f sd/common.py
),然后cp
。当然,
cp
各种系统上的各种 's 都有不同的选项可以做到这一点,但很容易走错路。您可以做的另一件事是避免
cp
并瞄准符号链接结果。ln -sf SOURCE DESTINATION
(两个 args 都是绝对路径)适用于所有 POSIX 系统,不会造成任何进一步的混淆。-f
删除任何现有的DESTINATION
文件/符号链接(但不是目录,唉)。您可以将其与realpath
避免相对/绝对路径问题相结合: