我正在尝试在我的主目录中创建一个符号链接,该链接指向我的外部硬盘上的目录。
当我像这样指定它时它工作得很好:
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/ ~/
答案1
这就是发生的事情。如果使用相对路径创建符号链接,则该符号链接将是相对的。符号链接仅存储您提供的路径。他们永远不会将路径解析为完整路径。跑步
$ pwd
/usr/bin
$ ln -s ls /usr/bin/ls2
创建一个名为ls2
in /usr/bin
to 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
答案2
我也遇到了同样的问题。谷歌得出了这个答案,但这里没有记录最简单的解决方案:
ln -sT
-T 就可以了
男人在:
-T, --no-target-directory
treat LINK_NAME as a normal file always
只需在此处添加它,以便任何有同样问题的人都可以找到它:)
答案3
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
答案4
非常简单,您可以为文件夹创建链接。看我的命令
ln -s /home/targedfolder /var/www/html/link_name