Buat tautan simbolis relatif ke direktori saat ini

110

Saya mencoba membuat tautan simbolis di direktori home saya yang mengarah ke direktori pada HDD eksternal saya.

Ini berfungsi dengan baik ketika saya menentukannya seperti ini:

cd ~
ln -s /run/media/name/exhdd/Data/ Data

Namun itu menciptakan tautan yang salah ketika saya mencoba ini:

cd /run/media/name/exhdd
ln -s Data/ ~/Data

Ini menciptakan tautan yang tidak bisa saya cdmasuki.

Ketika saya mencoba, bash mengeluh:

bash: cd: Data: Too many levels of symbolic links

Tautan simbolis data di rumah saya juga berwarna merah ketika lsdiatur untuk menampilkan keluaran berwarna.

Mengapa ini terjadi? Bagaimana saya bisa membuat tautan dengan cara itu? (Saya ingin membuat symlink ke direktori di direktori kerja saya di direktori lain.)


Sunting: sesuai dengan jawaban StackOverflow ini , jika argumen kedua (dalam kasus saya yang akan ~ / Data) sudah ada dan merupakan direktori, lnakan membuat symlink ke target di dalam direktori itu.

Namun, saya mengalami masalah yang sama dengan:

ln -s Data/ ~/
jcora
sumber
7
Hanya tip acak: cd ~biasanya sama dengan cd.
3
ls -l ~/Dataakan membantu Anda melihat apa yang salah dengan tautan "merah".
msw
Hm, tidak tahu saya bisa melakukan itu, terima kasih. Saya ingat pernah mencobanya cat, tapi saya lupa apa hasilnya ... (Saya tidak ada di rumah saat ini.)
jcora
Catatan tambahan, misalkan Anda hanya ingin membuat symlink dari semua file, dir dan subdir di dalam folder tertentu, katakanlah, semua item di dalam /run/media/name/exhdd/Data/untuk Datakemudian menggunakan yang berikutln -s /run/media/name/exhdd/Data/* Data
user2555595

Jawaban:

115

Inilah yang terjadi. Jika Anda membuat symlink dengan jalur relatif, symlink akan relatif. Symlinks hanya menyimpan jalur yang Anda berikan kepada mereka. Mereka tidak pernah menyelesaikan jalur ke jalur penuh. Lari

$ pwd
/usr/bin
$ ln -s ls /usr/bin/ls2

membuat symlink bernama ls2in /usr/binto ls(viz. /usr/bin/ls) relatif terhadap direktori tempat symlink berada di ( /usr/bin). Perintah di atas akan membuat symlink fungsional dari direktori mana pun.

$ pwd
/home/me
$ ln -s ls /usr/bin/ls2

Jika Anda memindahkan symlink ke direktori lain, itu akan berhenti menunjuk ke file di /usr/bin/ls.

Anda membuat symlink yang menunjuk Data, dan menamainya Data. Itu menunjuk pada dirinya sendiri. Anda harus membuat symlink dengan jalur absolut direktori.

ln -s "$(realpath Data)" ~/Data
Ujjwal Singh
sumber
14

Saya mengalami masalah yang sama. Google mengarah ke jawaban ini tetapi solusi paling sederhana tidak didokumentasikan di sini:

ln -sT 

-I melakukan trik

man ln:

-T, --no-target-directory
    treat LINK_NAME as a normal file always

Hanya menambahkan ini di sini sehingga siapa pun dengan pertanyaan yang sama dapat menemukan ini :)

tiegs
sumber
9

lnPerilaku dengan jalur relatif tidak intuitif. Untuk mengembalikan kewarasan, menggunakan -rbendera.

cd /run/media/name/exhdd
ln -sr Data/ ~/Data

Penjelasan:

   -r, --relative
          create symbolic links relative to link location

Apa artinya itu lnakan melakukan apa yang Anda harapkan. Ini akan mempertimbangkan direktori tempat Anda berada, direktori mana targetnya berada, dan membangun jalur relatif ke direktori yang akan -rdituju . Perilaku default (tanpa ) adalah menafsirkan parameter pertama (target) secara harfiah , di Jika demikian, Anda harus membuat jalur sendiri sehingga valid di direktori tautan.

Atau, gunakan jalur absolut, seperti yang disebutkan oleh @SmithJohn

ln -s "$(realpath Data)" ~/Data #bash shell

atau

ln -s "(realpath Data)" ~/Data #fish shell
Aleksandr Dubinsky
sumber
-1

Sederhananya Anda dapat membuat tautan untuk folder. Lihatlah perintah saya

ln -s / home / targatedfolder / var / www / html / link_name

Bhupendra Sahu
sumber