如何更新符号链接目标(ln -f -s 不工作)

sol*_*sol 45 symbolic-link

我正在使用

ln -f -s /var/www/html/releases/build1390 app-current

用新的目的地更新符号链接“app-current”。但是,这不起作用,链接“app-current”保持其原始目的地,但是,我没有收到任何错误...

我宁愿不删除链接并重新创建它,只需更新现有链接的目标。那可能吗?

Kyl*_*ndt 58

这对我有用,输出是strace ln -f -s /var/www/html/releases/build1390 app-current什么?

哦,因为它是一个目录,您需要添加-n以防止取消引用,这应该可以解决问题。-f确实更方便,因为添加 -f 只会导致它无论如何都取消链接。虽然我猜它在正常加载的系统上可能会快几百毫秒。

例如,如果 arf 已经指向 /home:

-n

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0
Run Code Online (Sandbox Code Playgroud)

没有-n

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1
Run Code Online (Sandbox Code Playgroud)

因此,没有-narf 被取消引用,因此 ln 将其视为 arf 就好像它实际上是 arf 一样/。在您的特定示例中,如果没有错误,我认为您可能已经在其中创建了一个新的符号链接/var/www/html/releases/build1390 app-current并且想要清理它。

  • 太好了,是 -n 做到了。非常感谢! (4认同)

aug*_*rar 14

如果目标是符号链接,您可以使用-n--no-dereference防止目标被取消引用。您还可以使用-T--no-target-directory来确保目标文件将始终被视为常规文件。

这些会产生稍微不同的行为,如下例所示。假设src是某个文件,dirlink是指向目录的符号链接,并且dir是实际目录。

使用-n

  • ln -sfn src dirlink覆盖dirlink并将其链接到src
  • ln -sfn src dir 创建链接 dir/src -> src

使用-T

  • ln -sfT src dirlink覆盖dirlink并将其链接到src
  • ln -sfT src dir 产生错误信息: ln: ‘dir’: cannot overwrite directory

  • 为 Linux 用户提供了最正确、最简洁的答案。 (2认同)