使用绝对路径和相对路径时,符号链接未按预期更新

使用绝对路径和相对路径时,符号链接未按预期更新

我正在尝试使用符号链接。我读了一些资料,找到了以下命令:

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

atest_link已创建,我可以ls -l使用它,但它似乎已损坏(与我在上面的问题中所说的相反)。

如何执行多目录级链接?

答案1

使用-fwithln将覆盖任何已存在的链接,因此只要您拥有正确的权限,它就应该可以工作……它对我来说一直有效。您使用的是什么操作系统?

答案2

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

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

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}

考虑到我的情况。

答案3

首要问题:

引用你的话:

创建和删除操作正常。但更新操作无效。执行此命令后,符号链接将失效。

问题具有给定的目录结构:

~/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 中不存在的文件。

如果你的 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 会将其视为普通文件。

例子:

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

答案4

$ 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

相关内容