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


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
  • 何が間違っていますか?
  • そのフォルダーの兄弟に保存されている1つのフォルダーへのシンボリックリンクを作成できませんか?
  • これのポイントは何ですか?

私はあなたがしたことに従っているかどうかわかりません。の出力ls -ld test test/*、またはこれらのファイルを作成するために実行したコマンドの正確なシーケンスを投稿してください。
ジル14

mkdirテスト。mkdir test / src; mkdir test / firefox; ln -s test / src test / firefox
デビッドゾリクタ

これらのコマンドでは、宙ぶらりんのシンボリックリンクであるためcd test/firefox/src、エラーが表示されます。と呼ばれる他のシンボリックリンクで実行していますか?cd: no such file or directory: test/firefox/srctest/firefox/srccdsrc
ジル14

あなたは私たちに言わないことln -sとの間で何かをしたと確信していcdます。test現在のディレクトリにサブディレクトリしかない場合、cd src(または実行したものは何でも)エラーがスローされます。何か入れましたtest/firefoxか?
ドゥブ14

5
そして、@ Gillesがヒントを与えたように、そのリンクはあなたが思っていることをしません。相対ターゲットを持つシンボリックリンクは、リンクを作成しディレクトリではなく、常にsymlinkディレクトリに対して相対的です。したがって、ディレクトリ内にある場合、a はto ではなく toを指すシンボリックリンクを作成します。/some/pathln -s test/src test/firefox/some/path/test/firefox/src/some/path/test/firefox/test/src/some/path/test/src
ドゥブ14

回答:


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

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

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。ありがとう!
ディミゲル

引数を正しく取得するのに問題があることがよくあります。OSXとGNU Linuxでは、それらは逆になっており、さらに混乱しています。
ダニエルW.

私はまだこれが機能するとは信じられません。
PNDA

5
相対リンクを使用できますが、シンボリックリンクがあるディレクトリに基づいている必要があります。言い換えると、最初の引数は、シンボリックリンクのファイルがあるディレクトリからターゲットディレクトリに移動する場合に、後で書き込むものと同じである必要がありcdます。
totymedli

9

シンボリックリンクは、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

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)"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.