Terlalu banyak level tautan simbolik

100

Saya membuat struktur file ini:

test/src
test/firefox

Ketika saya menjalankan perintah ini:

ln -s test/src test/firefox

Saya berharap tautan simbolik test/firefox/srcdibuat menunjuk test/src, namun saya mendapatkan kesalahan ini sebagai gantinya:

-bash: cd: src: Too many levels of symbolic links
  • Apa yang saya lakukan salah?
  • Tidak bisakah Anda membuat tautan simbolis ke satu folder yang disimpan dalam saudara dari folder itu?
  • Apa gunanya ini?
David Zorychta
sumber
Saya tidak yakin saya mengikuti apa yang Anda lakukan. Silakan kirim output dari ls -ld test test/*, atau urutan tepat dari perintah yang Anda jalankan untuk membuat file-file ini.
Gilles
tes mkdir; tes mkdir / src; uji mkdir / firefox; Pada tes-s / tes src / firefox
David Zorychta
Dengan perintah ini, cd test/firefox/srcakan muncul kesalahan cd: no such file or directory: test/firefox/src, karena test/firefox/srcmerupakan tautan simbolik yang menjuntai. Apakah Anda menjalankan cdtautan simbolis lain yang disebut src?
Gilles
Saya yakin Anda melakukan sesuatu antara ln -sdan cdyang tidak Anda beri tahu kami. Dengan asumsi bahwa hanya ada testsubdirektori di direktori Anda saat ini, a cd src(atau apa pun yang Anda jalankan) akan menampilkan kesalahan. Apakah Anda memasukkan sesuatu ke dalamnya test/firefox?
Dubu
5
Dan ketika @Gilles memberi petunjuk, tautan itu tidak akan melakukan apa yang Anda pikirkan. Tautan simbolik dengan target relatif selalu relatif terhadap direktori symlink , bukan direktori tempat Anda membuat tautan. Jadi, berada di direktori /some/path, a ln -s test/src test/firefoxakan membuat symlink yang menunjuk dari /some/path/test/firefox/srcke /some/path/test/firefox/test/src, bukan ke /some/path/test/src.
Dubu

Jawaban:

32

Di permukaan, apa yang Anda sarankan agar Anda coba berhasil untuk saya.

Contoh

$ mkdir -p test/src test/firefox

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

Buat tautan simbolis:

$ 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

Menjalankannya yang ke-2 biasanya akan menghasilkan ini:

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

Jadi Anda mungkin punya hal lain yang terjadi di sini. Saya akan curiga bahwa Anda memiliki referensi melingkar di mana tautan menunjuk kembali ke dirinya sendiri.

Anda dapat menggunakannya finduntuk mengelap hal ini sedikit:

$ cd /suspected/directory
$ find -L ./ -mindepth 15
slm
sumber
2
find -L ./ -mindepth 15mengungkapkan pelakunya
user7610
168

Seperti yang ditunjukkan Dubu dalam komentar, masalahnya terletak pada jalur relatif Anda. Saya punya masalah serupa yang menghubungkan konfigurasi nginx saya dari /usr/local/etc/nginxke /etc/nginx. Jika Anda membuat symlink Anda seperti ini:

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

Anda sebenarnya akan membuat tautan / etc / nginx -> / etc / nginx, karena jalur sumber relatif terhadap jalur tautan. Solusinya sesederhana menggunakan jalur absolut:

ln -s /usr/local/etc/nginx /etc/nginx
Steen Schütt
sumber
58
Jawaban ini lebih jelas daripada yang lain. "Gunakan jalur absolut."
wulftone
1
Saya dapat mengkonfirmasi bahwa ini berfungsi untuk saya di Windows menggunakan cygwin. Terima kasih!
dimiguel
Saya sering mengalami masalah untuk mendapatkan argumen yang benar. Di OSX dan GNU Linux, mereka terbalik yang membuat saya semakin bingung.
Daniel W.
Saya masih tidak percaya ini berhasil.
PNDA
5
Anda dapat menggunakan tautan relatif , tetapi tautan tersebut harus didasarkan pada direktori di mana tautan simbolisnya berada . Dengan kata lain: argumen pertama harus sama dengan yang akan Anda tulis setelahcd jika Anda ingin pergi ke direktori yang ditargetkan dari direktori tempat file tautan simbolik berada.
totymedli
9

Symlink relatif terhadap direktori induk tautan, bukan direktori saat ini dari lnproses.

Saat kamu melakukan:

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

(di mana test/firefoxdirektori), Anda membuat test/firefox/srcsymlink yang targetnya adalah test/src.

Itu test/srcrelatif terhadap test/firefoxdirektori, jadi itu symlink ke /top/dir/test/firefox/test/src.

Jika Anda ingin symlink itu menjadi tautan /top/dir/test/src, Anda harus menulis:

ln -s ../src test/firefox/

Atau

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

meskipun itu umumnya ide yang buruk untuk membuat symlink ke jalur absolut karena mereka mudah rusak ketika direktori diganti nama atau sistem file dipasang di tempat lain.

Dengan GNU ln, Anda dapat menggunakan -ropsi untuk membiarkannya melakukan perhitungan sendiri:

$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src
Stéphane Chazelas
sumber
5

Gunakan jalur absolut sebagai ganti jalur relatif, maka itu akan berhasil.

Misalnya:

ln -s /home/user/test/src /home/user/test/firefox
JISHNU TU
sumber
0

Jawabannya adalah menggunakan jalur absolut. Tapi itu bisa menjengkelkan untuk mengetik path lengkap untuk sesuatu yang ada di direktori saat ini. Anda dapat menggunakan perintah substitusi pwd untuk menghindarinya. Jika target Anda ada di direktori saat ini:

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

Jika tautan Anda ada di direktori saat ini:

ln -s /abs/path/to/target "$(pwd)"
penjual roti
sumber