我创建了这个文件结构:
test/src
test/firefox
当我运行这个命令时:
ln -s test/src test/firefox
我希望test/firefox/src
创建一个指向 的符号链接test/src
,但是我收到此错误:
-bash: cd: src: Too many levels of symbolic links
- 我究竟做错了什么?
- 您是否无法创建一个指向存储在该文件夹同级文件夹中的文件夹的符号链接?
- 这有什么意义呢?
答案1
正如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
如果您想使用相对路径并让它们按照您可能期望的方式运行,您可以使用该$PWD
变量轻松地将路径添加到当前工作目录路径,如下所示:
cd /usr/local/etc
ln -s "$PWD/nginx/" /etc/nginx
确保路径用双引号引起来,以确保当前路径中的空格等内容被转义。请注意,执行此操作时必须使用双引号,因为$PWD
如果使用单引号,则不会被替换。
答案2
从表面上看,您所建议的尝试对我有用。
例子
$ 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
答案3
符号链接是相对于链接的父目录,而不是相对于进程的当前目录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
答案4
答案是使用绝对路径。但输入当前目录中某些内容的完整路径可能会很烦人。您可以使用 pwd 命令替换来避免这种情况。如果您的目标位于当前目录中:
ln -s "$(pwd)"/target abs/path/to/link
如果您的链接应该在当前目录中:
ln -s /abs/path/to/target "$(pwd)"