太多级别的符号链接


100

我创建了这个文件结构:

test/src
test/firefox

当我运行此命令时:

ln -s test/src test/firefox

我希望test/firefox/src会创建一个指向的符号链接test/src,但是却收到此错误:

-bash: cd: src: Too many levels of symbolic links
  • 我究竟做错了什么?
  • 您是否无法创建指向存储在该文件夹的同级文件夹中的一个文件夹的符号链接?
  • 这有什么意义呢?

我不确定我会遵循你的所作所为。请发布的输出ls -ld test test/*,或发布您创建这些文件所运行的确切命令顺序。
吉尔斯2014年

mkdir测试;mkdir test / src; mkdir test / firefox; ln -s test / src test / firefox
David Zorychta 2014年

使用这些命令,cd test/firefox/src将显示错误cd: no such file or directory: test/firefox/src,因为test/firefox/src是悬空的符号链接。您是否cd在其他名为的符号链接上运行src
吉尔斯2014年

我确定您在ln -s和之间做了一些cd您不告诉我们的事情。假设test当前目录中只有一个子目录,则一个cd src(或您执行的任何内容)都将引发错误。你放东西了test/firefox吗?
Dubu 2014年

5
就像@Gilles给出的提示一样,该链接不会执行您认为的操作。具有相对目标的符号链接始终相对于symlink目录,而不是相对于创建链接的目录。所以,在一个目录是/some/path,一个ln -s test/src test/firefox将创建一个指向从一个符号链接/some/path/test/firefox/src/some/path/test/firefox/test/src/some/path/test/src
Dubu 2014年

Answers:


32

从表面上看,您所建议的对我来说是可行的。

$ mkdir -p test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    `-- [drwxrwxr-x]  ./test/src

进行符号链接:

$ ln -s test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    |   `-- [lrwxrwxrwx]  ./test/firefox/src -> test/src
    `-- [drwxrwxr-x]  ./test/src

第二次运行通常会产生以下结果:

$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists

因此,您可能在这里还有其他事情要做。我怀疑您有一个循环引用,其中链接指向其自身。

您可以使用find此方法进行侦查:

$ cd /suspected/directory
$ find -L ./ -mindepth 15

2
find -L ./ -mindepth 15揭示了罪魁祸首
user7610

167

正如Dubu在评论中指出的那样,问题出在您的相对路径上。将我的Nginx配置从符号链接/usr/local/etc/nginx到时,我遇到了类似的问题/etc/nginx。如果您这样创建符号链接:

cd /usr/local/etc
ln -s nginx/ /etc/nginx

实际上,您将创建链接/ etc / nginx-> / etc / nginx,因为源路径是相对于链接路径的。解决方案就像使用绝对路径一样简单:

ln -s /usr/local/etc/nginx /etc/nginx

57
这个答案比另一个答案更清楚。“使用绝对路径。”
wulftone

1
我可以使用确定在Windows上对我有效cygwin。谢谢!
dimiguel

我经常很难正确地论证。在OSX和GNU Linux上,它们相反,这使我更加困惑。
Daniel W.

我仍然不敢相信这行得通。
PNDA

5
您可以使用相对链接,但它们应基于符号链接所在的目录。换句话说:如果要从符号链接文件所在的目录转到目标目录,则第一个自变量应与之后写cd相同
totymedli

9

符号链接是相对于链接的父目录的,而不是相对于ln进程当前目录的。

当您这样做时:

cd /top/dir
ln -s test/src test/firefox

(在test/firefox目录中),您正在建立test/firefox/src目标为的符号链接test/src

test/src是相对于test/firefox目录的,因此是的符号链接/top/dir/test/firefox/test/src

如果您希望该符号链接成为的链接/top/dir/test/src,则需要编写:

ln -s ../src test/firefox/

要么

ln -s /top/dir/test/src test/firefox/

尽管对绝对路径进行符号链接通常不是一个好主意,因为在重命名目录或将文件系统安装在其他位置时,它们很容易断开。

使用GNU ln,您可以使用其-r选项让它自己进行计算:

$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src

5

使用绝对路径而不是相对路径,它将起作用。

例如:

ln -s /home/user/test/src /home/user/test/firefox

0

答案是使用绝对路径。但是为当前目录中的内容键入完整路径可能会很烦人。您可以使用pwd的命令替换来避免这种情况。如果目标位于当前目录中:

ln -s "$(pwd)"/target abs/path/to/link 

如果您的链接应该在当前目录中:

ln -s /abs/path/to/target "$(pwd)"
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.