Bagaimana cara membuat tautan simbolis relatif di Linux?

62

Saya perlu symlink yang menyelesaikan relatif terhadap direktori itu ditempatkan. Perintah apa yang digunakan untuk membuat hal seperti itu?

Jeremiah Rose
sumber

Jawaban:

78
  1. Buka direktori yang Anda inginkan tautannya
  2. Jalankan perintah ln -s ../some/other/file linkname

Jalur yang Anda berikan disimpan dengan file. Saat Anda mengakses file, jalur yang disimpan terlihat dan diperluas relatif ke file. Tidak tahu direktori tempat Anda berada saat membuat tautan.

Jeremiah Rose
sumber
23
Tidak, kamu tidak. Anda hanya perlu memastikan bahwa Anda menentukan lokasi relatif terhadap nama tautan, bukan direktori Anda saat ini.
Ignacio Vazquez-Abrams
5
Untuk membantu memahami: Jalur yang Anda berikan disimpan dengan file. Saat Anda mengakses file, jalur yang disimpan terlihat dan diperluas relatif ke file. Tidak tahu direktori tempat Anda berada saat membuat tautan.
Marian
2
persis sama:ln -s ../some/other/file /some/dir/linkname
sehe
1
Alih-alih turun direktori dan naik lagi, Anda juga bisa hanya ln -s ./file linknamekarena .merujuk ke direktori saat ini.
pduersteler
1
ln -s somedir/original-dir link-nametidak bekerja. Itu membuat direktori dengan nama link-nameyang berisi tautan yang tidak valid. Perintah yang berfungsi adalahln -sr somedir/original-dir link-name
Lorenz Meyer
28

Versi terbaru dari GNU coreutils ln (> = 8.16) mendukung opsi --relative(atau -r) yang berarti Anda dapat memanggil ln -sdengan jalur 2 absolut atau relatif (terkait dengan direktori kerja Anda) dan akan mengetahui jalur relatif yang benar yang harus ditulis ke symlink.

Bluewind
sumber
2
Terima kasih. The -rpilihan adalah membantu ketika Anda cross-compiling dan perlu path absolut pada membangun host tetapi path relatif pada target.
Robert Calhoun
rdfind dapat menghasilkan beberapa symlink yang benar-benar buruk yang tidak hanya absolut, tetapi mundur dari direktori tanpa alasan. ln -r -s targetfile myaliasdapat membantu Anda memperbaikinya
Ray Foss
2

Yang perlu Anda pahami pada dasarnya adalah bahwa symlink lebih seperti file teks daripada seperti entri direktori yang berisi file. Jadi jika kamu

echo ../poo >/file/name

maka itu sangat mirip dengan

ln -s ../poo /file/name

Sistem tidak peduli jika /file/../pooada sama sekali, itu hanya sepotong teks yang dimasukkan ke dalam symlink. Ketika sesuatu mencoba membuka symlink, saat itulah sistem mencoba untuk menyelesaikannya.

Jika Anda menggunakan shell dengan penyelesaian nama file, fitur ini dapat membingungkan hal-hal dengan memungkinkan Anda untuk melengkapi nama file relatif ke direktori kerja Anda saat ini, bahkan jika Anda kemudian menggunakannya sebagai target symlink di sepenuhnya direktori lain.

tripleee
sumber
Hal ini disalahgunakan oleh beberapa sistem panggilan - saya tahu misalnya BSD digunakan untuk memungkinkan Anda untuk symlink file sistem tertentu untuk <mengubah bagaimana sistem dialokasikan memori. Tentu saja tidak ada file yang disebutkan <dalam direktori itu, itu hanya cara murah untuk membuat hal seperti file yang sangat kecil yang memiliki beberapa properti menarik di atas file teks biasa pada platform tertentu.
tripleee
Tautan itu sekarang mati. Coba man.openbsd.org/OpenBSD-5.3/man5/malloc.conf.5 tetapi perhatikan juga bahwa perilaku di versi OpenBSD yang lebih baru jauh lebih sedikit ... penuh warna.
tripleee
0

Tautan relatif sulit bagi saya di OS X, yaitu

~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin

keduanya tidak berfungsi (ada sesuatu yang dibuat tetapi itu bukan direktori). Saya membuat tautan yang diinginkan dengan menggunakan jalur absolut .

~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin
Cody Hess
sumber
Ini solusi yang layak, jadi tidak perlu menjadi komentar. Ini bisa tetap sebagai jawaban yang terpisah.
slhck
1
Percobaan awal Anda dengan tautan relatif benar-benar salah dan itulah mengapa itu tidak berfungsi. Anda telah salah mengerti bagaimana tautan relatif bekerja. Tidak ada yang terlalu rumit tentang hal itu (bahkan jika Anda menggunakan OS X). Mungkin Anda salah arah dengan jawaban lain yang berbicara tentang membacakan direktori kerja Anda saat membuat tautan. Itu hanya untuk membuatnya lebih mudah untuk melakukan tautan dengan benar dan sama sekali tidak diperlukan. Anda tidak menentukan jalur relatif relatif terhadap direktori saat ini, tetapi ke direktori tautan. Inilah yang Anda kejar:ln -s Dropbox/git/codyhess/bin ~/bin
Timo
Juga @slhck ketika seseorang bertanya secara spesifik bagaimana membuat tautan relatif di dunia apa yang dikatakan bahwa Anda dapat melakukan tautan absolut merupakan "solusi yang layak"? Ini secara khusus tidak menjawab pertanyaan OP dan karenanya sangat berlawanan dengan solusi, itu bukan solusi. Ini seharusnya tidak menjadi komentar atau jawaban, itu harus menjadi pertanyaan "Bagaimana tepatnya tautan relatif berfungsi (dijelaskan sehingga pengguna mac memahaminya)?". Saya harap pengguna mac ini sekarang menjelaskannya dengan cukup baik. :)
Timo
@TimoLehto Mungkin Anda ingin mengarahkan komentar ke penulis asli (Cody Hess). Saya hanya menyalin pos.
slhck
@slhck, saya mengarahkannya kepada Anda, karena Anda menganggap solusi itu "layak" dan komentar Anda membuat saya berpikir bahwa Anda akan menjadi orang yang meyakinkan jika seseorang ingin menandai jawaban sebagai "bukan jawaban" (dan dapatkan penandaan diterima).
Timo
0

Saya hanya ingin menjelaskan lebih lanjut cara membuat symlink menggunakan jalur relatif (dengan contoh terperinci).

Seperti yang disebutkan Ignacio Vazquez-Abrams dalam komentar, Anda harus menentukan lokasi file / folder relatif ke tempat symlink akan dibuat, bukan relatif terhadap direktori Anda saat ini.

CONTOH

Anda berada di /usr/share/nginx/html/_src/learn Anda akan membuat symlink codingdi/usr/share/nginx/html

Buat symlink relatif (teori):

sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location

Buat symlink relatif aktual:

sudo ln -s ./_src/learn/coding ../../coding

Informasi lebih lanjut (contoh yang sama)

current path:                                  /usr/share/nginx/html/_src/learn
symlink(to be) relative to current path:       ../../coding                 
symlink location (absolute):                   /usr/share/nginx/html/coding
folder/file relative to symlink location:      ./_src/learn/coding
folder/file absolute path:                     /usr/share/nginx/html/_src/learn/coding  
Berusaha lebih keras
sumber