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
设置为显示彩色输出时,我家中的数据符号链接也显示为红色。
为什么会这样?如何以这种方式创建链接?(我想在另一个目录中的我的工作目录中创建一个目录的符号链接。)
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/bin
来ls
(即/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)