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


15

有两个目录foo1foo2

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

bar仍与foo1。Symlink foo2是在中创建的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(无版本)

Answers:


18

正确的方法是使用-n, --no-dereference类似的选项。

$ ln -snf foo2 bar

这导致ln将现有符号链接视为文件。否则,它将取消引用barfoo1,然后下降foo1并使用原始TARGET名称作为LINK_NAME,这就是为什么最终foo2foo1目录中创建符号链接的原因。的手册页ln指出以下内容...

-n,-无引用
       如果LINK_NAME是指向以下文件的符号链接,则将其视为普通文件
       目录

以下是我的Arch Linux桌面上具有8.21版(ln带有和不带有该--no-dereference选项)的shell输出,我得到了与不带有该选项的结果相同的结果--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

感谢您的回答。如果是环境相关的问题,我将编写我的环境。您正在使用哪个操作系统?什么输出ln --version
ironsand

我在版本8.17的Fedora 18 VM上尝试了此操作。有趣的是,我在带有8.21版本的Arch Linux桌面上进行了尝试,并得到了与您相同的结果。看起来在这两个版本之间的某个地方有所变化。我发布的解决方案虽然在两种情况下都有效。
Drew Chapin 2013年

仅供参考,我在justlinux.com论坛上找到了这个答案。
德鲁·查平

谢谢druciferre!我什至从未想到ln命令如此频繁地升级。
ironsand

我也在osx中​​测试过。ln与ubuntu和centos相同,目录被覆盖并ln -snf解决了问题。即使ln -h是在osx中​​使用的首选选项。
ironsand
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.