it-swarm-id.com

Buat tautan simbolis ke nama path relatif

Aku bisa melakukan ini:

$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt

Tetapi saya ingin dapat melakukan ini:

$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

Apakah ini mungkin? Bisakah saya entah bagaimana menyelesaikan relatif pathname dan meneruskannya ke ln?

65
Humphrey Bogart

Jika Anda membuat tautan simbolis ke jalur relatif, itu akan menyimpannya sebagai tautan simbolis relatif, tidak absolut seperti contoh Anda. Ini umumnya hal yang baik. Tautan simbolis absolut tidak berfungsi saat sistem file dipasang di tempat lain.

Alasan contoh Anda tidak berfungsi adalah karena relatif terhadap direktori induk dari tautan simbolik dan bukan tempat ln dijalankan.

Anda dapat melakukan:

$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

Atau untuk itu:

$ cd foo
$ ln -s foo/bar.txt ../bar.txt

Penting untuk menyadari bahwa argumen pertama setelah ln -s disimpan sebagai target symlink. Ini dapat berupa sembarang string (dengan satu-satunya batasan yang tidak boleh kosong dan tidak dapat berisi karakter NUL), tetapi pada saat symlink sedang digunakan dan diselesaikan, string tersebut dipahami sebagai jalur relatif ke jalur direktori induk dari symlink (ketika itu tidak dimulai dengan /).

66
penguin359

Jika Anda menggunakan coreutils yang lebih baru (Saya menggunakan coreutils-8.22-11), ia memiliki opsi untuk melakukan itu:

ln --help | grep relative

dapat menyimpan teks sewenang-wenang; jika nanti diselesaikan, tautan relatif adalah -r, --relative buat tautan simbolis relatif ke lokasi tautan

Sebagai contoh:

$ mkdir /tmp/test
$ touch /tmp/test/to
$ ln -rs /tmp/test/to /tmp/test/from
$ ls -l /tmp/test/from
    lrwxrwxrwx 1 ptr ptr 4 aug   25 17.02 /tmp/test/to -> from
25
ptr

Maaf tidak. Tautan simbolik relatif terhadap lokasi tautan, bukan lokasi Anda saat membuat tautan. Ada beberapa alasan bagus untuk perilaku ini, yang sebagian besar melibatkan pemasangan sistem file jarak jauh.

12
Shadur

Ada utilitas kecil yang mudah disebut symlinks (awalnya oleh Mark Lords, sekarang dikelola oleh J. Brandt Buckley), hadir di banyak distribusi Linux.

Untuk mengonversi semua tautan simbolik absolut dalam direktori menjadi relatif:

symlinks -c /path/to/directory

Sayangnya tidak ada opsi untuk mengonversi satu tautan, Anda harus memindahkannya ke direktori sendiri terlebih dahulu.

mkdir ../tmp
mv link-to-relativize ../tmp
symlinks ../tmp
mv ../tmp/* .
rmdir ../tmp

Kamu bisa mencoba:

ln -s `pwd`/bar.txt /home/beau/bar.txt

Tapi, itu membuat tautan simbolis ke pathname absolut. Pertanyaan tekstual Anda menanyakan menyebutkan pathname relatif ...

Biasanya, nama path relatif adalah apa yang Anda inginkan, dan apa ln -s Memberi anda. Saya pikir yang Anda inginkan adalah:

cd /home/beau
ln -s foo/bar.txt bar.txt
3
MattBianco

Saat shell paling umum memperluas path, untuk membuat symlink relatif Anda harus mengutip "path sumber".

Juga -s parameter berarti --symbolic. ln secara default membuat tautan keras.

$ ln -s '../../relative_path' path
$ ls -al path

lrwxrwxrwx 1 empjustine empjustine 19 Aug  6 01:38 path -> ../../relative/path
1
emp.justine

Jika Anda yakin tidak ada kemungkinan poin mount Anda berubah, Anda dapat mencapai apa yang Anda coba lakukan dalam bash Shell seperti ini:

ln -s `pwd`/bar.txt ~/bar.txt

Ini mengasumsikan bahwa Anda berada di direktori target ketika membuat tautan simbolik.

0
mreff555