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

时间:2012-05-08 14:16:24

标签: linux symlink

我有一个名为current的实时服务器的符号链接,我在releases目录中有发布,即current -> releases/2012-05-08_15-13

如果我想更新current目录的符号链接,我必须取消链接/ rm并重新启用它。

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

5 个答案:

答案 0 :(得分:7)

ln的形式是

ln -sf sourcefile targetlink

尝试

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

删除当前并创建新链接。

答案 1 :(得分:3)

如果您想在一个命令中执行此操作,请执行@hughw建议并运行ln -sf

如果你想原子地替换符号链接(即,没有符号链接不存在的时间点),请创建一个新的符号链接,然后mv覆盖旧的符号链接。

答案 2 :(得分:0)

正如ToddR所建议的,这里唯一的答案实际上可能适用于大多数Linux版本 - 肯定是Ubuntu - 它使用来自coreutils软件包的ln)。让我向你证明。

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

所以Linux上的正确方法是:

ln -sfn source target
  

-n, - no-dereference                 如果LINK_NAME是指向目录的符号链接,则将其视为普通文件

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

在我的例子中,

matthewh@xen:~$ ls -l releases/dirA/
total 0
lrwxrwxrwx 1 matthewh matthewh 13 Apr  7 10:03 dirB -> releases/dirB

答案 3 :(得分:0)

正确答案:

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

移动是原子操作。

不要使用&#39; ln -snf&#39;。 strace&#39; ln -snf&#39;显示两个系统调用unlink + symlink。

答案 4 :(得分: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