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
了,但它似乎坏了(与我所说的相反) 如何执行多目录级别的链接?
#1 楼
将-f
与ln
一起使用将覆盖已经存在的任何链接,因此,只要您具有正确的权限,它就可以正常工作。您使用什么操作系统?评论
我已用有关此问题的更多信息更新了我的问题。
–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
评论
我建议使用unlink而不是rm。使用取消链接,您永远不会因为意外使用错误的开关而丢失源目录中的任何文件。您在命令中使用前导/
@jpsy,如果确实如此,关于取消链接的建议将非常有用。尝试触摸zzzz;取消zzzz的链接。 (取消链接调用,取消链接与rm相同,但没有花哨的选项,也没有递归)。
为什么使用-n? (可能是问题)。另外,如果您的ln支持-t,则在这种情况下使用它,而-T或destination /在其他情况下使用。