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


45

我正在使用

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

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

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

Answers:


55

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

哦,因为它是目录,所以您需要添加它-n而无需取消引用,这应该可以解决问题。-f确实提供了更多便利,因为添加-f只会导致它始终取消链接。尽管我猜想它在正常加载的系统上可能会快几百毫秒。

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

strace与-n

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

strace没有-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

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


4
很好,是-n完成的。非常感谢!
solsol 2010年

12

如果目标是符号链接,则可以使用-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

1
对于Linux用户而言,它是最正确,最简洁的答案。
罗斯

有什么方法可以强制覆盖目标目录,这样您就不会收到错误消息cannot overwrite directory
gitaarik

@rednaw您可以通过链接几个命令来执行此操作,但是ln它本身不会删除目录-这可能不是一个好主意,因为它将需要递归地删除可能数量庞大的文件。
augurar 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.