Mengapa tautan simbolis saya tidak berfungsi?

24

Saya mencoba untuk lebih memahami tautan simbolik ... dan tidak memiliki banyak keberuntungan. Ini adalah keluaran shell saya yang sebenarnya dengan nama pengguna / host diubah:

username@host:~$ mkdir actual
username@host:~$ mkdir proper
username@host:~$ touch actual/file-1.txt
username@host:~$ echo "file 1" > actual/file-1.txt
username@host:~$ touch actual/file-2.txt
username@host:~$ echo "file 2" > actual/file-2.txt
username@host:~$ ln -s actual/file-1.txt actual/file-2.txt proper
username@host:~$ # Now, try to use the files through their links
username@host:~$ cat proper/file-1.txt
cat: proper/file-1.txt: No such file or directory
username@host:~$ cat proper/file-2.txt
cat: proper/file-2.txt: No such file or directory
username@host:~$ # Check that actual files do in fact exist
username@host:~$ cat actual/file-1.txt
file 1
username@host:~$ cat actual/file-2.txt
file 2
username@host:~$ # Remove the links and go home :(
username@host:~$ rm proper/file-1.txt
username@host:~$ rm proper/file-2.txt

Saya berpikir bahwa tautan simbolik seharusnya beroperasi secara transparan, dalam arti bahwa Anda dapat beroperasi pada file yang menunjuk seolah-olah Anda mengakses file secara langsung (kecuali tentu saja dalam kasus di rmmana tentu saja tautannya hanya dihapus ).

orokusaki
sumber
Bagaimana disk Anda diformat? Sistem file apa yang Anda gunakan? (FAT tidak mendukung symlink tetapi jika Anda mencoba membuat pada filesystem FAT, itu akan memberikan kesalahan.)
Nicole Hamilton
@NicoleHamilton - Ini ext4 (menurut df -T) - apakah hasil di atas juga aneh bagi Anda?
orokusaki
@orokusaki Tidak aneh. Lihat jawaban saya di bawah ini. Hanya kepala, tidak perlu menyentuh file untuk melayani mereka. Mereka bahkan tidak perlu ada. Hanya untuk menghemat mengetik!
nerdwaller

Jawaban:

50

Symlink cenderung menyukai jalur penuh atau relatif ke tautan, jika tidak mereka sering dapat mencari file-1.txtsecara lokal (cukup aneh).

Arahkan ke properdan jalankan ls -ldan Anda dapat melihat bahwa symlink sedang mencari actual/file-1.txt, kapan seharusnya ../actual/file-1.txt.

Jadi, Anda memiliki dua opsi:

  1. Berikan jalan penuh

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
  2. Arahkan ke folder yang Anda inginkan tautannya dan tautkan dari sana

    cd proper
    ln -s ../actual/file-1.txt ../actual/file-2.txt ./

Sunting : Sebuah petunjuk untuk menyimpan pengetikan.

Anda bisa melakukannya ln -s ~/actual/file-{1,2}.txt ~/proper

Barang-barang di kurung kurawal diganti dan ditempatkan setelah satu sama lain, menciptakan perintah

ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper

yang menghubungkan kedua file ke direktori target. Menghemat beberapa pengetikan utama saat Anda melanjutkan dalam shell.

nerdwaller
sumber
2
Terima kasih - saya baru saja akan mencabut rambut saya sebelum saya membaca jawaban Anda.
orokusaki
1
Ini kadang-kadang membingungkan pasti! Linux cenderung sangat literal, jadi jika Anda mengatakan melakukan sesuatu - itu akan. Hati-hati dengan symlinking folder seperti itu, saya telah ditimpa satu atau dua sebelumnya (Cukup tentukan nama tanpa garis miring). Juga, jangan rm -rf *ke folder yang terhubung - Anda dapat menghapus folder yang terhubung dengannya. Lakukan saja symlinkname rm. Hanya beberapa hal yang saya buat salah: D
nerdwaller
3

Masalahnya adalah penggunaan jalur relatif. Jika Anda menentukan kreasi tautan Anda dengan jalur eksplisit penuh, ini berfungsi.

$ ln -s ~ / actual / file1.txt ~ / actual / file2.txt ~ / proper /

$ cat proper / file1.txt

file 1

$

Contoh Anda membuat tautan dalam propertampilan itu untuk subdirektori yang bernama aktual di bawah direktori saat ini, alih-alih sebagai induk dari keduanya.

Don Simon
sumber
1

Tautan simbolis bisa rumit. Intinya, tautan simbolik adalah file yang berisi nama file / pathname untuk file lain (dan yang ditandai untuk perlakuan khusus). Jika pathname dalam file tautan dimulai dengan ' /', maka itu diperlakukan sebagai pathname absolut, dan segalanya cukup mudah. Jika tidak dimulai dengan garis miring, ini diperlakukan sebagai pathname relatif - relatif terhadap direktori tempat tautan berada. (Ini benar apakah namanya mengandung garis miring atau tidak.) Jadi, Anda membuat proper/file–1.txttautan ke " actual/file–1.txt", dan ketika Anda mencoba mengaksesnya, sistem mencoba mengaksesnya proper/actual/file–1.txt. Anda seharusnya mengatakannya

ln s  ../actual/file1.txt  ../actual/file2.txt  proper

Ngomong-ngomong, Anda tidak perlu touchperintah.  echo "file 1" > actual/file–1.txtcukup untuk membuat actual/file–1.txt.

Scott
sumber
0

Masalah terkait, dan mungkin terlihat jelas bagi banyak orang, tetapi membuat saya bingung selama beberapa menit: jika Anda membuat symlink di dalam direktori yang disinkronkan dengan sendirinya, atau ada symlink di jalur direktori kerja saat ini, Anda mungkin mengalami masalah dengan symlink yang tidak berfungsi.

Gunakan cd ..dan ls -lberulang kali, untuk melihat apakah direktori orang tua Anda sendiri terhubung.

Jika Anda perlu membuat symlink, cdke direktori Target asli, dan membuat symlink baru di sana, sehingga jalur relatifnya akurat.

Atau dengan kata lain: jalur relatif adalah dari Asal ke Target. Jika Origin kemudian disinkronkan, tidak apa-apa. Tapi Anda mungkin mengalami masalah dalam menyiapkan Origin nama link baru dalam direktori yang dengan sendirinya entah bagaimana disinkronkan.

Chrisky
sumber
1
Alih-alih " cd ..dan ls -lberulang kali", Anda bisa menggunakan namei -mox $PWD. Cara lain yang bermanfaat untuk mengetahui apakah ada symlink di sepanjang path adalah dengan menggunakan pwd -P, yang memberi Anda path ke direktori saat ini yang tidak mengandung symlink (jadi jika pwddan pwd -Pmemberikan output yang berbeda, Anda tahu ada symlink di suatu tempat di sepanjang jalan) ).
Ansa211
0

Ketika Anda mencoba membuat tautan ke file yang tidak ada (atau Anda telah memberikan jalurnya dengan salah) ln -s tidak menimbulkan kesalahan. Itu membuat tautan tetapi ketika Anda mencoba 'cat' pada tautan itu dikatakan tidak ada file yang ditemukan. Bahkan ketika Anda bisa melihatnya menggunakan ls. Dalam kasus seperti itu, selalu periksa ulang jalur file Anda.

ubuntu@ip-172-31-80-155:~/lab5$ ln -s etc/ufw/ufw.conf link1
ubuntu@ip-172-31-80-155:~/lab5$ ls -al
total 5360
drwxrwxr-x 2 ubuntu ubuntu    4096 Mar  9 18:56 .
drwxr-xr-x 7 ubuntu ubuntu    4096 Mar  9 18:42 ..
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link1
cat: link1: No such file or directory

Karena file etc / ufw / ufw.conf tidak ada. Jalur yang benar adalah /etc/ufw/ufw.conf

ubuntu@ip-172-31-80-155:~/lab5$ ln -s /etc/ufw/ufw.conf link2
ubuntu@ip-172-31-80-155:~/lab5$ ls -l
total 5352
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
lrwxrwxrwx 1 ubuntu ubuntu      17 Mar  9 19:00 link2 -> /etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link2
# /etc/ufw/ufw.conf
#

# Set to yes to start on boot. If setting this remotely, be sure to add a rule
# to allow your remote connection before starting ufw. Eg: 'ufw allow 22/tcp'
ENABLED=no

# Please use the 'ufw' command to set the loglevel. Eg: 'ufw logging medium'.
# See 'man ufw' for details.
LOGLEVEL=low
sindhura
sumber
Sudah ada jawaban yang lebih baik, dan bagian pertama, bahwa ln -s"kadang-kadang" tidak memeriksa keberadaan target itu salah.
RalfFriedl