有两个目录foo1
和foo2
。
首先,我通过 创建目录符号链接ln -s foo1 bar
。之后我想更改符号链接,因此我输入了ln -sf foo2 bar
但bar
仍与 相链接foo1
。foo2
在 内部创建了符号链接foo1
。
当我想替换时我应该输入foo1
什么foo2
?
我在三个环境中进行了测试。
- Ubuntu 12.04,ln(GNU coreutils)8.13
- CentOS 6.4,ln(GNU coreutils)8.4
- 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