创建相对于当前目录的符号链接

jco*_*ora 114 directory symlink ln

我正在尝试在我的主目录中创建一个符号链接,该链接指向我的外部 HDD 上的一个目录。

当我像这样指定它时它工作正常:

cd ~
ln -s /run/media/name/exhdd/Data/ Data
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试这样做时,它会创建一个错误的链接:

cd /run/media/name/exhdd
ln -s Data/ ~/Data
Run Code Online (Sandbox Code Playgroud)

这会创建一个我无法cd进入的链接。

当我尝试时,bash 抱怨:

bash: cd: Data: Too many levels of symbolic links
Run Code Online (Sandbox Code Playgroud)

ls设置为显示彩色输出时,我家中的数据符号链接也显示为红色。

为什么会这样?如何以这种方式创建链接?(我想在另一个目录中的我的工作目录中创建一个目录的符号链接。)


编辑:根据这个StackOverflow 答案,如果第二个参数(在我的例子中是 ~/Data)已经存在并且是一个目录,ln将创建一个指向该目录目标的符号链接。

但是,我遇到了同样的问题:

ln -s Data/ ~/
Run Code Online (Sandbox Code Playgroud)

小智 118

这就是正在发生的事情。如果您使用相对路径创建符号链接,则符号链接将是相对的。符号链接仅存储您提供给它们的路径。他们从不解析完整路径的路径。跑步

$ pwd
/usr/bin
$ ln -s ls /usr/bin/ls2
Run Code Online (Sandbox Code Playgroud)

创建一个名为符号链接ls2/usr/binls(即/usr/bin/ls相对于目录)的符号链接是(/usr/bin)。上面的命令将从任何目录创建一个功能符号链接。

$ pwd
/home/me
$ ln -s ls /usr/bin/ls2
Run Code Online (Sandbox Code Playgroud)

如果您将符号链接移动到不同的目录,它将不再指向位于/usr/bin/ls.

您正在制作一个指向 的符号链接Data,并为其命名Data。它指向自己。您必须使用目录的绝对路径创建符号链接。

ln -s "$(realpath Data)" ~/Data
Run Code Online (Sandbox Code Playgroud)


小智 19

我遇到了同样的问题。谷歌给出了这个答案,但这里没有记录最简单的解决方案:

ln -sT 
Run Code Online (Sandbox Code Playgroud)

-T 解决问题

男人:

-T, --no-target-directory
    treat LINK_NAME as a normal file always
Run Code Online (Sandbox Code Playgroud)

只需在此处添加此内容,以便任何有相同问题的人都可以找到此内容:)


Ale*_*sky 15

ln相对路径的行为是不直观的。要恢复理智,请使用-r标志。

cd /run/media/name/exhdd
ln -sr Data/ ~/Data
Run Code Online (Sandbox Code Playgroud)

解释:

   -r, --relative
          create symbolic links relative to link location
Run Code Online (Sandbox Code Playgroud)

这意味着它ln会做你所期望的。它将考虑您所在的目录,目标所在的目录,并构建一个相对于链接所在目录的路径。默认行为(没有-r)是从字面上解释第一个参数(目标),在在这种情况下,您必须自己构建路径,以便它在链接的目录中有效。

或者,使用绝对路径,如@SmithJohn 所述

ln -s "$(realpath Data)" ~/Data #bash shell
Run Code Online (Sandbox Code Playgroud)

或者

ln -s "(realpath Data)" ~/Data #fish shell
Run Code Online (Sandbox Code Playgroud)