如何将目录的符号链接更改为另一个目标?

如何将目录的符号链接更改为另一个目标?
# 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 linkln -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 的默认行为。

相关内容