如何覆盖目录的符号链接?

如何覆盖目录的符号链接?

有两个目录foo1foo2

首先,我通过 创建目录符号链接ln -s foo1 bar。之后我想更改符号链接,因此我输入了ln -sf foo2 bar

bar仍与 相链接foo1foo2在 内部创建了符号链接foo1

当我想替换时我应该输入foo1什么foo2

我在三个环境中进行了测试。

  1. Ubuntu 12.04,ln(GNU coreutils)8.13
  2. CentOS 6.4,ln(GNU coreutils)8.4
  3. OS X 10.7.5, ln (无版本)

答案1

正确的方法是使用-n, --no-dereference像这样的选项。

$ ln -snf foo2 bar

这会导致ln将现有的符号链接视为文件。否则,它会取消bar对的引用foo1,下降到foo1并使用原始TARGET名称作为,LINK_NAME这就是为什么最终会在目录foo2内创建符号链接的原因foo1。 上的手册页ln说明了以下内容...

-n, --no-dereference
       如果 LINK_NAME 是指向某个文件的符号链接,则将其视为普通文件
       目录

ln下面是我的 Arch Linux 桌面上版本 8.21 上带有和不带有该选项的 shell 输出--no-dereference,我得到了与不使用此选项时相同的结果--no-dereference,但使用该--no-dereference选项它可以按预期工作。

$ mkdir foo1 foo2
$ ln -s foo1 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ln -sf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ls -l foo1
  total 0
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 foo2 -> foo2
$ ln -snf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:52 bar -> foo2

相关内容