我正在尝试使用符号链接。我读了一些资料,找到了以下命令:
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
使用-f
withln
将覆盖任何已存在的链接,因此只要您拥有正确的权限,它就应该可以工作……它对我来说一直有效。您使用的是什么操作系统?
答案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
第二个问题:
引用你的话:
我到处都读到过,无法更新/覆盖符号链接。因此,网络上存在相互矛盾的信息。谁是对的?如果可以更新/覆盖符号链接,我该如何实现这一点?
回答你的问题“谁是对的”,我不确定你到底读了什么,或者你是如何理解的。但是,以下内容应该有助于澄清:
- 哪些内容可以更新,以及
- 如果不使用适当的开关则无法更新。
使用非目录作为目标来更新符号链接。
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