太多级别的符号链接

Dav*_*hta 151 linux filesystems ln

我创建了这个文件结构:

test/src
test/firefox
Run Code Online (Sandbox Code Playgroud)

当我运行此命令时:

ln -s test/src test/firefox
Run Code Online (Sandbox Code Playgroud)

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

-bash: cd: src: Too many levels of symbolic links
Run Code Online (Sandbox Code Playgroud)
  • 我究竟做错了什么?
  • 您不能创建一个指向存储在该文件夹的同级文件夹中的文件夹的符号链接吗?
  • 这有什么意义?

Ste*_*ütt 251

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

cd /usr/local/etc
ln -s nginx/ /etc/nginx
Run Code Online (Sandbox Code Playgroud)

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

ln -s /usr/local/etc/nginx /etc/nginx
Run Code Online (Sandbox Code Playgroud)

如果您想使用相对路径并让它们按照您可能期望的方式运行,您可以使用pwd将当前工作目录路径放入,如下所示:

cd /usr/local/etc
ln -s "$(pwd)/nginx/" /etc/nginx
Run Code Online (Sandbox Code Playgroud)

您可能希望在路径周围加上引号,以确保对当前路径中的空格等内容进行转义。请注意,执行此操作时必须使用双引号,因为$(pwd)如果使用单引号,则不会被替换。

  • 这个答案比另一个更清楚。“使用绝对路径。” (79认同)
  • 您可以使用**相对链接**,但它们应该**基于符号链接所在的目录**。换句话说:如果你想从符号链接文件所在的目录转到目标目录,第一个参数应该与你在 `cd`** 之后写的 ** 相同。 (8认同)
  • 我可以确认这在 Windows 上使用 `cygwin` 对我有用。谢谢! (2认同)

slm*_*slm 46

从表面上看,您所建议的尝试对我有用。

例子

$ mkdir -p test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    `-- [drwxrwxr-x]  ./test/src
Run Code Online (Sandbox Code Playgroud)

制作符号链接:

$ 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
Run Code Online (Sandbox Code Playgroud)

第二次运行它通常会产生这样的结果:

$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists
Run Code Online (Sandbox Code Playgroud)

所以你可能有其他事情在这里发生。我怀疑您有一个循环引用,其中链接指向自身。

你可以用它find来侦查一下:

$ cd /suspected/directory
$ find -L ./ -mindepth 15
Run Code Online (Sandbox Code Playgroud)

  • `find -L ./ -mindepth 15` 揭示了罪魁祸首 (3认同)

Sté*_*las 17

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

当你这样做时:

cd /top/dir
ln -s test/src test/firefox
Run Code Online (Sandbox Code Playgroud)

(其中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/
Run Code Online (Sandbox Code Playgroud)

或者

ln -s /top/dir/test/src test/firefox/
Run Code Online (Sandbox Code Playgroud)

尽管创建指向绝对路径的符号链接通常是一个坏主意,因为当重命名目录或将文件系统挂载到其他地方时,它们很容易被破坏。

使用 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
Run Code Online (Sandbox Code Playgroud)


小智 12

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

例如:

ln -s /home/user/test/src /home/user/test/firefox
Run Code Online (Sandbox Code Playgroud)