如何在一个命令中删除并重新创建现有的符号链接?

问题描述 投票:0回答:5

我的实时服务器有一个名为

current
的符号链接,并且我在
releases
目录中发布了版本,即
current -> releases/2012-05-08_15-13

如果我想更新我的

current
目录的符号链接,我必须取消链接/rm 它并重新 ln -s 它。

我的问题是:如何删除符号链接并将其一步更新到最新版本。

linux symlink
5个回答
7
投票

ln 的形式为

ln -sf sourcefile targetlink

尝试

ln -sf releases/2012-05-08_15-13 current

删除当前链接并创建新链接。


3
投票

如果您想在单个命令中执行此操作,请按照 @hughw 建议并运行

ln -sf

如果您想原子地替换符号链接(即,不存在符号链接不存在的时间点),请创建一个新的符号链接,然后

mv
将其覆盖旧的符号链接。


3
投票

正如 ToddR 所建议的,这是真正适用于大多数 Linux 版本的唯一答案(绝对是 Ubuntu),它使用 coreutils 包中的 ln)。让我证明给你看吧。

$ cd ~
$ mkdir -p releases/dirA
$ mkdir -p releases/dirB
$ ln -s releases/dirA
$ ls -l dirA
lrwxrwxrwx 1 matthewh matthewh 13 Apr  7 09:58 dirA -> releases/dirA
$ ln -sf releases/dirB
$ rm dirA
$ ln -s releases/dirA current
$ ln -sf releases/dirB current
$ ls -l current
lrwxrwxrwx 1 matthewh matthewh 13 Apr  7 09:59 current -> releases/dirA  <--- DOESN'T WORK!
$ ln -sfn releases/dirB current <--- WORKS!
$ ls -l current
lrwxrwxrwx 1 matthewh matthewh 13 Apr  7 09:59 current -> releases/dirB

所以Linux上正确的方法是:

ln -sfn source target

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

这是至关重要的,如果你不使用 -n 开关,你最终会在源目录中得到一个名为“target”的符号链接。

在我的例子中,

$ ls -l releases/dirA/

total 0
lrwxrwxrwx 1 matthewh matthewh 13 Apr  7 10:03 dirB -> releases/dirB

1
投票

正确答案:

ln -s new current_tmp && mv -Tf current_tmp current

移动是原子操作。

不要使用“ln -snf”。 strace 'ln -snf' 显示两个系统调用 unlink + symlink。


0
投票

此示例清除了 -sfn 开关的使用:

drwxr-xr-x. 10 root    root         4096 Aug 25 18:24 .
dr-xr-xr-x. 25 root    root         4096 Aug 19 10:32 ..
lrwxrwxrwx.  1 wildfly wildfly        25 Aug 25 18:15 wildfly -> /opt/wildfly-8.2.0.Final/
drwxr-xr-x. 10 wildfly wildfly      4096 Aug 25 18:28 wildfly-8.2.0.Final

                                                link to            link
                                                  |                 |
[gecloud@ip-10-227-224-45 opt]$ sudo ln -sfn wildfly-8.2.0.Final /opt/wildfly
[gecloud@ip-10-227-224-45 opt]$ ls -la
total 115540
drwxr-xr-x. 10 root    root         4096 Aug 25 18:34 .
dr-xr-xr-x. 25 root    root         4096 Aug 19 10:32 ..
lrwxrwxrwx.  1 root    root           19 Aug 25 18:34 wildfly -> wildfly-8.2.0.Final
drwxr-xr-x. 10 wildfly wildfly      4096 Aug 25 18:28 wildfly-8.2.0.Final
© www.soinside.com 2019 - 2024. All rights reserved.