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

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


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

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

Update

这是我的目录结构:

~/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了,但它似乎坏了(与我所说的相反)

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

评论

我建议使用unlink而不是rm。使用取消链接,您永远不会因为意外使用错误的开关而丢失源目录中的任何文件。

您在命令中使用前导/

@jpsy,如果确实如此,关于取消链接的建议将非常有用。尝试触摸zzzz;取消zzzz的链接。 (取消链接调用,取消链接与rm相同,但没有花哨的选项,也没有递归)。

为什么使用-n? (可能是问题)。另外,如果您的ln支持-t,则在这种情况下使用它,而-T或destination /在其他情况下使用。

#1 楼

-fln一起使用将覆盖已经存在的任何链接,因此,只要您具有正确的权限,它就可以正常工作。您使用什么操作系统?

评论


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

–JérômeVerstrynge
2012年5月17日12:56

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

–palswim
2015年1月3日在6:10



@palswim这个SO帖子暗示它是安全的,因为-f只是在后台调用了unlink()和link():stackoverflow.com/a/1466570/157385。不过,我希望我会记住正确的顺序!

– Mike Branski
2015年2月9日在18:33



不起作用。需要-n。查看已接受的答案。

–肖恩·韦尔奇
16年5月13日在15:49



MacOS需要-n进行更新。

–没了
19年2月14日在17:50

#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}


考虑我的情况。

评论


有关为什么的其他信息,区别是一个是相对路径(不带前导/),另一个是绝对路径(带前导/)。如果您正在管理Linux系统,那么了解这些差异至关重要。例如,rm -rf ./*和rm -rf /.*之间的差异决定您是否保留工作:)

– Safado
2012年5月17日14:10



这不会回答“如何更新/覆盖符号链接”问题

–搜索
2012年5月17日15:53

ln -sfn {path / to / file-name} {link-name}这行。

–JérômeVerstrynge
2012年5月17日17:27

-n(--no-dereference)使其将{link name}视为普通文件,而不是遵循链接。鉴于您需要对该链接进行操作而不遵循它,因此必须使用此选项。

– feldoh
16-11-25在10:34

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

–蔡力强
17年11月25日在5:30



#3 楼

第一期:

报价:


创建和删除都可以。但是更新不起作用。在
执行此命令后,符号链接将失效。


给定目录结构的问题:


〜/ scripts /测试/〜/ 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:
-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


#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


评论


当我使用1级目录执行测试时,它可以工作,但是我尝试使用多级目录,但它不工作。我已经更新了我的问题。

–JérômeVerstrynge
2012年5月17日在12:57