2011-03-09 69 views
37

我创建了一个符号链接:无法覆盖符号链接RedHat Linux上

sudo ln -s /some/dir new_dir 

现在我要覆盖符号链接指向一个新的位置,它不会覆盖。我曾尝试:

sudo ln -f -s /other/dir new_dir 

我总能sudo rm new_dir,但我宁愿有它相应的,如果可能的覆盖。有任何想法吗?

回答

60
ln -sfn /other/dir new_dir 

适合我。 -n不解引用目标符号链接。

+1

好点。从手册页:'-h如果target_file或target_dir是符号链接,请不要关注它。这对于使用-f选项非常有用,可以替换可能指向目录的符号链接。“# – redent84 2011-03-09 21:37:46

+1

'-n'等效于'-h'(至少在MacOS X上) – redent84 2011-03-09 21:39:10

9

您可以创建它,然后移动它:

sudo ln -f -s /other/dir __new_dir 
sudo mv -Tf __new_dir new_dir 

编辑:缺少-Tf,治疗目录作为一个常规文件,并且不提示进行覆盖。

这样你会覆盖它。

1

由于从mikeytown2s评论链接被打破,我将解释为什么redent84s answer更好:

虽然

ln -sfn newDir currentDir 

做工作,它不是一个原子操作,你可以看到与strace:

$ strace ln -snf newDir currentDir 2>&1 | grep link 
unlink("currentDir")   = 0 
symlink("newDir", "currentDir") = 0 

这是很重要的,当你有一个web服务器的根指向该符号链接。它可能会导致错误,而符号链接被删除并重新创建 - 即使在微秒的时间范围内。

以避免错误使用,而不是:

$ ln -s newDir tmpCurrentDir && mv -Tf tmpCurrentDir currentDir 

这将创建一个临时链接和后覆盖currentDir在一个原子操作