如何在Linux中创建相对符号链接?


Answers:


77
  1. 转到您想要链接驻留的目录
  2. 运行命令 ln -s ../some/other/file linkname

您提供的路径与文件一起存储。当您访问文件时,将查找存储的路径并相对于文件展开。创建链接时,它不知道您所在的目录。


23
不,你不会。您只需要确保指定相对于链接名称的位置即可,而不是当前目录。
伊格纳西奥·巴斯克斯

5
为了帮助理解:提供的路径与文件一起存储。当您访问文件时,将查找存储的路径并相对于文件展开。创建链接时,它不知道您所在的目录。
玛丽安2010年

2
完全等效:ln -s ../some/other/file /some/dir/linkname
sehe 2011年

1
除了引用目录后,您还可以这样做,ln -s ./file linkname因为它.指向当前目录。
pduersteler

1
ln -s somedir/original-dir link-name不起作用。它创建的目录名称link-name包含无效的链接。有效的命令是ln -sr somedir/original-dir link-name
Lorenz Meyer

28

最新版本的GNU coreutils的ln(> = 8.16)支持--relative(或-r)选项,这意味着您可以ln -s使用2条绝对或相对(相对于您的工作目录)路径进行调用,它将找出必须使用的正确相对路径。写入符号链接。


2
谢谢。-r当您进行交叉编译并且在构建主机上需要绝对路径但在目标上需要相对路径时,该选项很有用。
罗伯特·卡尔洪

rdfind可能会产生一些非常糟糕的符号链接,这些符号链接不仅是绝对的,而且无缘无故地移出目录。ln -r -s targetfile myalias可以帮助您解决问题
Ray Foss

2

您需要了解的基本上是,符号链接更像是文本文件,而不是包含文件的目录条目。所以如果你

echo ../poo >/file/name

那很像

ln -s ../poo /file/name

系统根本不在乎是否/file/../poo存在,它只是符号链接中的一段文本。当某些东西试图打开符号链接时,就是系统尝试解析它的时候。

如果您使用的是具有文件名补全功能的Shell,则即使您最终将其用作完全另一个目录中的符号链接的目标,此功能也会允许您完成相对于当前工作目录的文件名,从而使事情混乱。


这被某些系统调用所滥用-我知道例如BSD用于允许您对特定系统文件进行符号链接<以更改系统分配内存的方式。当然<,该目录中没有命名的文件,这只是一种创建类似文件的小文件的廉价方法,该文件具有比该特定平台上的常规文本文件更吸引人的属性。
Tripleee '18

该链接现在已消失。尝试使用man.openbsd.org/OpenBSD-5.3/man5/malloc.conf.5,但还要注意,最新版本的OpenBSD的行为要少得多……丰富多彩。
三人节

0

在OS X上,相对链接对我来说很棘手,即

~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin

两者都不起作用(创建了某些东西,但它不是目录)。我通过使用绝对路径创建了所需的链接。

~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin

这是一个可行的解决方案,因此无需评论。这可以作为一个单独的答案。
slhck 2011年

1
您最初尝试使用相对链接是完全错误的,这就是为什么它不起作用的原因。您误解了相对链接的工作方式。没什么特别棘手的(即使您使用的是OS X也没有)。创建链接时,关于如何选择工作目录的其他答案可能使您误入歧途。那只是为了使正确链接更容易,而且没有必要。您没有定义相对于当前目录的相对路径,而是相对于链接目录的相对路径。这就是您所追求的:ln -s Dropbox/git/codyhess/bin ~/bin
蒂莫(Timo)

还有@slhck,当有人特别询问如何在哪个世界中创建相对链接时,说可以做绝对链接的说法构成了“可行的解决方案”?它专门不能回答OP的问题,因此与解决方案完全相反,不是解决方案。这不应该是评论也不是答案,而应该是一个问题“相对链接是如何工作的(解释以便Mac用户理解)?”。我希望这个mac用户现在已经足够好解释了。:)
Timo's

@TimoLehto也许您想将评论发送给原始作者(Cody Hess)。我只编辑了帖子。
slhck '16

@slhck,我已将其指示给您,因为您认为该解决方案是“可行的”,而您的评论使我认为您可以说服一个人是否要将答案标记为“不是答案”(并获得答案)。标记已接受)。
蒂莫,2016年

0

我只是想进一步说明如何使用相对路径创建符号链接(带有详细示例)。

正如注释中提到的Ignacio Vazquez-Abrams一样,您必须指定相对于将创建符号链接的位置(而不是相对于当前目录)的文件/文件夹位置。

您在/usr/share/nginx/html/_src/learn 您将创建一个符号链接coding/usr/share/nginx/html

创建相对符号链接(理论):

sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location

创建实际的相对符号链接:

sudo ln -s ./_src/learn/coding ../../coding

更多信息(相同示例)

current path:                                  /usr/share/nginx/html/_src/learn
symlink(to be) relative to current path:       ../../coding                 
symlink location (absolute):                   /usr/share/nginx/html/coding
folder/file relative to symlink location:      ./_src/learn/coding
folder/file absolute path:                     /usr/share/nginx/html/_src/learn/coding  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.