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


我正在尝试使用符号链接。我做了一些阅读并找到了以下命令:

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 它,但它似乎被打破(与我在上面的问题中所说的相反)。

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


150
2018-05-17 12:39




我建议使用 unlink 代替 rm。同 unlink 你不会因意外使用错误的开关而丢失丢失源目录中的任何文件的风险。 - Jpsy
您正在使用命令中的前导/ - Jamie Cook
@jpsy你对unlink的建议会非常好, 如果是真的。试试触摸zzzz; unlink zzzz。 (取消链接调用,取消链接与rm相同,但没有花哨的选项,也没有递归)。 - ctrl-alt-delor
为何使用 -n? (可能是问题)。如果你的ln支持 -t 然后使用它,对于这些情况,和 -T 要么 destination/ 对于其他情况。 - ctrl-alt-delor


答案:


运用 -f 同 ln 将覆盖已存在的任何链接,因此只要您拥有正确的权限,它就应该有效......它总是对我有用。您使用什么操作系统?


124
2018-05-17 12:49



我已经更新了我的问题以及有关我的问题的更多信息。 - Jérôme Verstrynge
我在linux下。 - Jérôme Verstrynge
如果你换了 ln 参数,就像我很容易做的那样 -f 切换破坏现有文件(链接目标)?在任何一种情况下,我们都有 -i 如果你想要一点安全性,参数(它将提示用户进行覆盖)也是如此。 - palswim
@palswim这个SO帖子暗示它是安全的,因为 -f 只是打电话 unlink() 和 link() 引擎盖下: stackoverflow.com/a/1466570/157385。我希望我能记住正确的顺序! - Mike Branski
不起作用。需求 -n。见接受的答案。 - Shawn Welch


好的,我发现我的错误在哪里:一个不应该放第一个 / 在路上。

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

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}

考虑我的情况。


91
2018-05-17 13:32



有关其原因的一些其他信息,差异就是一个 relative 路径(没有前导/),另一个是 absolute 路径(带前导/)。如果您正在管理Linux系统,那么了解差异就很重要了。例如,之间的区别 rm -rf ./* 和 rm -rf /.* 决定你是否保住工作:) - Safado
这不回答“如何更新/覆盖sym链接”的问题 - Sirch
ln -sfn {path / to / file-name} {link-name}行。 - Jérôme Verstrynge
这有什么不同 -n 选项吗? - dokaspar
-n( - no-dereference)使得它像普通文件一样处理{link name}而不是跟随链接。鉴于您需要在该链接上操作而不是遵循它,您必须使用此选项。 - feldoh


首要问题:

引用你:

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

给定目录结构的问题:

〜/ scripts / test /〜/ scripts / test / remote_loc /   〜/脚本/测试/ remote_loc / SITE1 /   〜/脚本/测试/ remote_loc / SITE1 / stuff1.txt   〜/脚本/测试/ remote_loc /站点2 /   〜/脚本/测试/ remote_loc /站点2 / stuff2.txt   〜/脚本/测试/ remote_loc /站点2 /   〜/脚本/测试/ 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:
  如果LINK_NAME是指向目录的符号链接,则-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

10
2018-06-08 22:58





$ 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

6
2018-05-17 12:42



当我使用1级目录执行测试时,它可以工作,但我尝试使用多级目录,但它不起作用。我已经更新了我的问题。 - Jérôme Verstrynge