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

Ars*_*ika 10 linux symbolic-link

# ln -sv /path/to/target /path/to/link
‘/path/to/link’ -> ‘/path/to/target’
Run Code Online (Sandbox Code Playgroud)

现在我想用 target2 替换该目标:

# ln -sfv /path/to/target2 /path/to/link
‘/path/to/link/target2’ -> ‘/path/to/target2’
Run Code Online (Sandbox Code Playgroud)

哇!那里发生什么了?尾部斜杠没有任何影响:

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’
Run Code Online (Sandbox Code Playgroud)

如何实现’/path/to/link’ -> ’/path/to/target2’

l0b*_*0b0 16

使用-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’
Run Code Online (Sandbox Code Playgroud)

也就是说,ln -s target link将工作一样ln -s target link/target ,如果link链接到一个目录

大多数 Linux 命令工具会在应用它们的操作之前尝试取消引用符号链接,否则符号链接将大多只是混乱且几乎无用。我猜ln原作者认为在这种情况下,一致性比一定程度的简单性更重要(有可能让习惯了其他工具的人感到困惑)。