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

iro*_*and 17 linux ln macos

有两个目录foo1foo2.

起初,我通过ln -s foo1 bar. 之后我想更改符号链接,所以我输入ln -sf foo2 bar

bar仍与foo1. 符号链接foo2是在foo1.

我应该怎么输入,当我想要替换foo1foo2

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

  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(无版本)

Dre*_*pin 21

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

$ ln -snf foo2 bar
Run Code Online (Sandbox Code Playgroud)

这导致ln将现有符号链接视为文件。否则,将取消引用barfoo1,下降到foo1并使用原TARGET名称作为LINK_NAME,这就是为什么你用一个符号链接落得foo2内部创建foo1目录。联机帮助页ln说明以下内容...

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

下面是我的 Arch Linux 桌面上的 shell 输出,版本 8.21ln有和没有--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
Run Code Online (Sandbox Code Playgroud)