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


110

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

当我这样指定时,它可以正常工作:

cd ~
ln -s /run/media/name/exhdd/Data/ Data

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

cd /run/media/name/exhdd
ln -s Data/ ~/Data

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

当我尝试时,bash抱怨:

bash: cd: Data: Too many levels of symbolic links

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

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


编辑:根据 StackOverflow答案,如果第二个参数(在我的情况下为〜/ Data)已经存在并且是目录,ln则会该目录创建指向目标的符号链接。

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

ln -s Data/ ~/

7
只是一个随机提示:cd ~通常与相同cd

3
ls -l ~/Data本来可以帮助您查看“红色”链接出了什么问题。
msw

嗯,不知道我能做到,谢谢。我记得尝试过cat,但是我忘记了结果是什么...(我当时不在他们家。)
jcora

侧面说明,假设你想只能创建的所有文件,目录和子目录的特定文件夹内的一个符号链接,比方说,里面的所有项目/run/media/name/exhdd/Data/,以Data然后使用以下ln -s /run/media/name/exhdd/Data/* Data
user2555595

Answers:


115

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

$ pwd
/usr/bin
$ ln -s ls /usr/bin/ls2

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

$ pwd
/home/me
$ ln -s ls /usr/bin/ls2

如果将符号链接移到其他目录,它将停止指向处的文件/usr/bin/ls

您正在建立一个指向Data并命名的符号链接Data。它指向自己。您必须与目录的绝对路径进行符号链接。

ln -s "$(realpath Data)" ~/Data

14

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

ln -sT 

-T绝招

人ln:

-T, --no-target-directory
    treat LINK_NAME as a normal file always

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


9

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

cd /run/media/name/exhdd
ln -sr Data/ ~/Data

说明:

   -r, --relative
          create symbolic links relative to link location

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

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

ln -s "$(realpath Data)" ~/Data #bash shell

要么

ln -s "(realpath Data)" ~/Data #fish shell

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.