Çok fazla sembolik bağlantı seviyesi


100

Bu dosya yapısını oluşturdum:

test/src
test/firefox

Bu komutu çalıştırdığımda:

ln -s test/src test/firefox

test/firefox/srcİşaret ederek sembolik bir bağ kurulmasını beklerdim test/src, bunun yerine şu hatayı alıyorum:

-bash: cd: src: Too many levels of symbolic links
  • Neyi yanlış yapıyorum?
  • Bu klasörün kardeşinde depolanan bir klasöre sembolik bir bağlantı oluşturamıyor musunuz?
  • Bunun amacı ne?

Yaptıklarını takip ettiğimden emin değilim. Lütfen ls -ld test test/*bu dosyaları oluşturmak için koştuğunuz komutun çıktısını veya tam komut sırasını gönderin.
Gilles,

mkdir testi; mkdir testi / src; mkdir testi / firefox;
-n

Bu komutlarla cd test/firefox/srchatayı gösterir cd: no such file or directory: test/firefox/src, çünkü test/firefox/srcsarkan sembolik bir bağdır. cdDenilen başka bir sembolik bağlantı üzerinde mi çalışıyorsun src?
Gilles

Sana arasında bir şey yaptım eminim ln -sve cdbize söylemedin kalmamasıdır. testGeçerli dizininizde yalnızca bir alt dizin bulunduğunu varsayarsak, cd src(veya ne yaptıysanız) bir hata atmalıdır. Bir şey mi koydun test/firefox?
Dubu

5
@Gilles'in bir ipucu verdiği gibi, bu bağlantı düşündüğünüzü yapmayacaktır. Göreceli hedefleri olan sembolik bağlantılar, bağlantıyı oluşturduğunuz dizine değil, her zaman sembolik bağlantı dizinine göre değişir . Yani, bir dizindeki olmanın /some/path, bir ln -s test/src test/firefoxgelen işaret eden bir sembolik yaratacak /some/path/test/firefox/srckadar /some/path/test/firefox/test/src, değil için /some/path/test/src.
Dubu

Yanıtlar:


32

Yüzeyde, önerdiğin şey benim için çalışıyor.

Örnek

$ mkdir -p test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    `-- [drwxrwxr-x]  ./test/src

Sembolik bağlantıyı yap:

$ 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. kez çalıştırılması genellikle şunu üretir:

$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists

Bu yüzden muhtemelen burada başka bir şeyler oluyor. Bir bağlantının kendisine dönük olduğunu gösteren dairesel bir referansınız olduğundan şüpheleniyorum.

Bunu findbiraz uzatmak için kullanabilirsiniz :

$ cd /suspected/directory
$ find -L ./ -mindepth 15

2
find -L ./ -mindepth 15suçlu ortaya çıkardı
user7610 13:16

167

Dubu'nun bir yorumda işaret ettiği gibi, sorun göreceli yollardadır. Nginx konfigürasyonumu 'dan' /usr/local/etc/nginxye bağlarken benzer bir problem yaşadım /etc/nginx. Sembolik linkinizi bu şekilde oluşturursanız:

cd /usr/local/etc
ln -s nginx/ /etc/nginx

Aslında / etc / nginx -> / etc / nginx linkini yapacaksınız, çünkü kaynak yolu linkin yoluna göredir. Çözüm, mutlak yollar kullanmak kadar basittir:

ln -s /usr/local/etc/nginx /etc/nginx

57
Bu cevap diğerinden daha netti. "Mutlak yollar kullan."
wulftone

1
Bunun Windows kullanarak benim için çalıştığını onaylayabilirim cygwin. Teşekkürler!
dimiguel

Argümanları düzeltmek için sık sık problem yaşıyorum. OSX ve GNU Linux'ta, beni daha da şaşırtan tersine çevrildiler.
Daniel W.

Bunun işe yaradığına hala inanamıyorum.
PNDA,

5
Göreceli bağlantıları kullanabilirsiniz , ancak bunlar sembolik bağlantının bulunduğu dizine dayanmalıdır . Başka bir deyişle: İlk argüman , sembolik bağlantının dosyasının bulunduğu dizinden hedeflenen dizine gitmek istiyorsanız, yazacağınız yazı ile aynıcd olmalıdır .
totymedli

9

İşaret işaretleri, lnişlemin geçerli dizinine değil, bağlantının ana dizinine göredir .

Ne zaman yaparsın:

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

( test/firefoxBir dizin nerede ), test/firefox/srchedefi olan bir sembolik bağlantı oluşturuyorsunuz test/src.

Yani test/srcgörelidir test/firefoxdizine, böylece bir sembolik var /top/dir/test/firefox/test/src.

Bu bağlantının bağlantı kurmasını /top/dir/test/srcistiyorsanız, şunu yazmanız gerekir:

ln -s ../src test/firefox/

Veya

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

genel olarak, dizinler yeniden adlandırıldığında veya dosya sistemleri başka bir yere monte edildiğinde kolayca koptuğu için sembolik bağlantıları kesin yollara sokmak kötü bir fikirdir.

GNU ile hesaplamayı kendi başına yapmasına izin vermek için seçeneğini lnkullanabilirsiniz -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

Göreceli yol yerine mutlak yolu kullanın, sonra çalışacaktır.

Örneğin:

ln -s /home/user/test/src /home/user/test/firefox

0

Cevap mutlak yol kullanmaktır. Ancak geçerli dizindeki bir şeyin tam yolunu yazmak can sıkıcı olabilir. Bundan kaçınmak için, pwd'nin komut değiştirmesini kullanabilirsiniz. Hedefiniz geçerli dizindeyse:

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

Bağlantınız geçerli dizinde olmalıdır:

ln -s /abs/path/to/target "$(pwd)"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.