如何覆盖/更新符号链接?


187

我正在尝试使用符号链接。我做了一些阅读,发现以下命令:

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

创建和删除工作正常。但是更新不起作用。执行此命令后,符号链接将无效。

我在这里和那里已经读过,不可能更新/覆盖符号链接。因此,网络上存在矛盾的信息。谁是对的?如果符号链接可以更新/覆盖,我该如何实现?

更新资料

这是我的目录结构:

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

~/scripts/test/,当我执行时:

ln -s /remote_loc/site1 test_link

test_link创建了一个,我可以ls -l,但是它似乎坏了(与我在上面的问题中所说的相反)。

如何执行多目录级别的链接?


1
我建议使用unlink代替rm。这样一来,unlink您就不会冒险因意外使用错误的开关而丢失源目录中的任何文件。
Jpsy 2014年

您在命令中使用了前导/
Jamie Cook

@jpsy,如果是真的,关于断开链接的建议将非常有用。尝试触摸zzzz;取消zzzz的链接。(取消链接调用,取消链接与rm相同,但没有花哨的选项,也没有递归)。
ctrl-alt-delor

为什么使用-n?(可能是问题)。同样,如果您的ln支持,-t则在这些情况和/ -Tdestination/其他情况下使用它。
ctrl-alt-delor

Answers:


150

使用-fwith ln会覆盖已经存在的任何链接,因此,只要您具有正确的权限,它就应该起作用...它一直对我有用。您使用什么操作系统?


我已用有关此问题的更多信息更新了我的问题。
杰罗姆Verstrynge

我在linux下。
杰罗姆Verstrynge

2
如果您ln像我倾向于那样切换参数,该-f切换是否会破坏您现有的文件(链接目标)?无论哪种情况,-i如果您需要一点安全性,也都可以使用参数(将提示用户进行覆盖)。
palswim,2015年

2
@palswim这SO后意味着它是安全的,因为-f只是调用unlink()link()引擎盖下:stackoverflow.com/a/1466570/157385。不过,我希望我只记得正确的顺序!
Mike Branski

4
不起作用。需要-n。查看已接受的答案。
肖恩·韦尔奇

118

好的,我发现了我的错误所在:不应将第一个/放在路径中。

换句话说,我的问题中的命令应为:

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

代替

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

考虑我的情况。


22
有关为什么的其他信息,不同之处是一个是relative路径(不带前导/),另一个是absolute路径(带前导/)。如果您正在管理Linux系统,那么了解差异是至关重要的。例如,rm -rf ./*和之间的差异rm -rf /.*决定了您是否继续工作:)
萨法多(Safado)2012年

5
这并不回答“如何更新/此改变一个符号链接”
Sirch

ln -sfn {path / to / file-name} {link-name}这行。
杰罗姆Verstrynge

6
-n(--no-dereference)使它像对待普通文件一样对待{link name}而不是遵循链接。鉴于您需要对该链接进行操作而不遵循它,因此必须使用此选项。
feldoh,2016年

1
此答案应为带有-n替换符号链接参数的突出显示答案。
蔡仔

12

首要问题:

报价给您:

创建和删除工作正常。但是更新不起作用。执行此命令后,符号链接将无效。

给定目录结构的问题:

〜/ scripts / test /〜/ scripts / test / remote_loc /〜/ scripts / test / remote_loc / site1 /〜/ scripts / test / remote_loc / site1 / stuff1.txt〜/ scripts / test / remote_loc / site2 /〜/ scripts /test/remote_loc/site2/stuff2.txt〜/ scripts / test / remote_loc / site2 /〜/ scripts / test / remote_loc / site3 / stuff3.txt

并使用以下命令:

ln -s /remote_loc/site1 test_link

是它在您的$ PWD或当前工作目录中创建了一个符号链接,该链接指向/ remote_loc / site1上的/或root以外的不存在文件。

如果您的PWD在〜/ scripts /中,那么您应该使用以下命令:

ln -s remote_loc/site1 test_link

否则,您可能会使用完整的绝对路径,例如:

ln -s /home/yourusername/remote_loc/site1 test_link

第二期:

报价给您:

我在这里和那里已经读过,不可能更新/覆盖符号链接。因此,网络上存在矛盾的信息。谁是对的?如果符号链接可以更新/覆盖,我该如何实现?

要回答“谁是对的人”这个问题,我不确定您确切地阅读了什么,或者如何理解。但是,以下内容应有助于清除:

  1. 可以更新什么,以及
  2. 不使用适当的开关就无法更新。


使用非目录目标更新符号链接。

ln -sf:
-f或--force删除现有的目标文件,该文件用于更新链接的目标或目标。

例:

 ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

但是,如您所见,如果绝对路径位于ln的参数中,它将给出绝对路径。当前工作目录与链接的父目录不同时,必须提供完整路径。


相对路径:

ln -sfr:
-r或--relative创建相对于链接位置的符号链接。

例:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

但是,如果目标是目录,则更新到目录的链接将不起作用。

例:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:47 testdir.link -> testdir

如您所见,尽管使用了ln上面的参数中给出的绝对路径名而没有使用-r选项,但是符号链接仍然相对于该链接。


更新目录链接:

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

例:

ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

与之相反:

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir

6
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2

当我使用1级目录执行测试时,它可以工作,但是我尝试使用多级目录,但它不工作。我已经更新了我的问题。
杰罗姆Verstrynge
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.