【发布时间】:2011-07-12 03:26:07
【问题描述】:
我创建了一个符号链接:
sudo ln -s /some/dir new_dir
现在我想覆盖符号链接以指向一个新的位置,它不会覆盖。我试过了:
sudo ln -f -s /other/dir new_dir
我总是可以sudo rm new_dir,但如果可能的话,我宁愿让它相应地覆盖。有什么想法吗?
【问题讨论】:
我创建了一个符号链接:
sudo ln -s /some/dir new_dir
现在我想覆盖符号链接以指向一个新的位置,它不会覆盖。我试过了:
sudo ln -f -s /other/dir new_dir
我总是可以sudo rm new_dir,但如果可能的话,我宁愿让它相应地覆盖。有什么想法吗?
【问题讨论】:
ln -sfn /other/dir new_dir
为我工作。 -n 不会取消引用目标符号链接。
【讨论】:
-h If the target_file or target_dir is a symbolic link, do not follow it. This is most useful with the -f option, to replace a symlink which may point to a directory.
-n 等价于-h(至少在 MacOS X 上)
您可以创建它然后移动它:
sudo ln -f -s /other/dir __new_dir
sudo mv -Tf __new_dir new_dir
edit:缺少-Tf,将目录视为常规文件,不提示覆盖。
这样你会覆盖它。
【讨论】:
由于来自 mikeytown2s 评论的链接被破坏,我将解释为什么 redent84s answer 更好:
虽然
ln -sfn newDir currentDir
完成这项工作,它不是原子操作,正如您可以通过 strace 看到的那样:
$ strace ln -snf newDir currentDir 2>&1 | grep link
unlink("currentDir") = 0
symlink("newDir", "currentDir") = 0
当您有一个指向该符号链接的网络服务器根目录时,这一点很重要。当符号链接被删除并重新创建时,它可能会导致错误 - 即使在微秒的时间跨度内。
为了防止错误,请改用:
$ ln -s newDir tmpCurrentDir && mv -Tf tmpCurrentDir currentDir
这将创建一个临时链接,然后在原子操作中覆盖 currentDir。
【讨论】: