私はこのファイル構造を作成しました:
test/src
test/firefox
このコマンドを実行すると:
ln -s test/src test/firefox
シンボリックリンクを期待しますtest/firefox/src
を指すように作成されますtest/src
、ただし、代わりにこのエラーが発生します。
-bash: cd: src: Too many levels of symbolic links
表面的には、あなたが提案したことは、私のために機能します。
$ 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
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
シンボリックリンクは、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
相対パスの代わりに絶対パスを使用すると、機能します。
例えば:
ln -s /home/user/test/src /home/user/test/firefox
答えは絶対パスを使用することです。しかし、現在のディレクトリにあるもののフルパスを入力するのは面倒です。これを回避するには、pwdのコマンド置換を使用できます。ターゲットが現在のディレクトリにある場合:
ln -s "$(pwd)"/target abs/path/to/link
リンクが現在のディレクトリにある場合:
ln -s /abs/path/to/target "$(pwd)"