# ln -sv /path/to/target /path/to/link
‘/path/to/link’ -> ‘/path/to/target’
现在我想用 target2 替换该目标:
# ln -sfv /path/to/target2 /path/to/link
‘/path/to/link/target2’ -> ‘/path/to/target2’
哇哦!发生了什么?尾部斜线没有任何作用:
ln -sfv /path/to/target2/ /path/to/link
‘/path/to/link/target2’ -> ‘/path/to/target2/’
# ln -sfv /path/to/target2/ /path/to/link/
‘/path/to/link/target2’ -> ‘/path/to/target2/’
# ln -sfv /path/to/target2 /path/to/link/
‘/path/to/link/target2’ -> ‘/path/to/target2’
如何实现’/path/to/link’ -> ’/path/to/target2’
?
答案1
使用-n
/ --no-dereference
(“如果 LINK_NAME 是目录的符号链接,则将其视为普通文件”):
$ ln -sv /var/log /tmp/my-link
‘/tmp/my-link’ -> ‘/var/log’
$ ln -sfnv /var/opt /tmp/my-link
‘/tmp/my-link’ -> ‘/var/opt’
也就是说ln -s target link
,ln -s target link/target
如果link
链接到目录。
大多数 Linux 命令工具在执行操作之前都会尝试取消引用符号链接,否则符号链接将只会造成混淆且几乎无用。我猜原作者ln
认为在这种情况下一致性比一定程度的简单性更重要(这可能会让习惯使用其他工具的人感到困惑)。
答案2
l0b0 的答案很好。它很简单,这使得它在大多数情况下最适合命令行使用。但在某些情况下,您可能会关心它不是原子的。 ln -sf
首先删除旧的符号链接,然后创建新的符号链接,因此有一段短暂的时间不存在符号链接。
如果需要小心,最好在临时位置创建新的符号链接,然后将mv
其放到位。
这里有一个 ruby 实现:http://blog.moertel.com/posts/2005-08-22-how-to-change-symlinks-atomic.html。不过,用任何语言实现它都很容易。我不知道为什么它不是 ln 的默认行为。