web-dev-qa-db-ja.com

シンボリックリンクのレベルが多すぎます

私はこのファイル構造を作成しました:

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つのフォルダーへのシンボリックリンクを作成できませんか?
  • これのポイントは何ですか?
111
David Zorychta

表面的には、あなたが提案したことは、私のために機能します。

$ 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

2回目に実行すると、通常は次のようになります。

$ 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
35
slm

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
185
Steen Schütt

シンボリックリンクは、lnプロセスの現在のディレクトリではなく、リンクの親ディレクトリを基準にしています。

あなたがするとき:

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

test/firefoxはディレクトリです)、ターゲットがtest/firefox/srcであるtest/srcシンボリックリンクを作成しています。

そのtest/srctest/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
9

相対パスの代わりに絶対パスを使用すると、機能します。

例えば:

ln -s /home/user/test/src /home/user/test/firefox
6
JISHNU T U

答えは絶対パスを使用することです。しかし、現在のディレクトリにあるもののフルパスを入力するのは面倒です。これを回避するには、pwdのコマンド置換を使用できます。ターゲットが現在のディレクトリにある場合:

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

リンクが現在のディレクトリにある場合:

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