Göreceli bir yol adına sembolik bir bağlantı yapın


64

Bunu yapabilirim:

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

Ancak bunu yapabilmek istiyorum:

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

Mümkün mü? Göreceli yol adını bir şekilde çözüp iletebilir miyim ln?


Ancak tarif edilen davranışla çözülmesi gereken problem nedir?
forcefsck

Öyleyse, indirmek için sıkıştırılmış bir klasör sunduğunuzu ve klasör dosyalarının bazılarının nasıl linkleneceğine ilişkin kopyalanabilir talimatlar vermek istediğinizi varsayalım.
Humphrey Bogart

2
ln -s $(pwd)/bar.txt ~/veya bir yükleme komut dosyası ekleyin.
forcefsck

2
link gerçekte komut satırında kullandığınız adı saklar. Bu adın bir dosyaya çözümü bağlantı konumuna göre yapılır. Kullanmanız gerekirln -s foo/bar.txt /home/beau/bar.txt
pqnet

Yanıtlar:


62

Göreceli bir yola sembolik bir bağlantı oluşturursanız, örneğin gösterdiğiniz gibi mutlak değil, göreceli bir sembolik bağlantı olarak depolar. Bu genellikle iyi bir şeydir. Mutlak sembolik bağlantılar, dosya sistemi başka bir yere monte edildiğinde çalışmaz.

Örneğinizin çalışmamasının nedeni, bunun sembolik bağlantının üst dizinine göre olup ln, çalıştırıldığı yer değil .

Yapabilirsin:

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

Veya bunun için:

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

İlk argümanın ln -ssembolik bağın hedefi olarak saklandığını fark etmek önemlidir . İsteğe bağlı herhangi bir dize olabilir (yalnızca boş bırakılamadığı ve NUL karakterini içeremediği kısıtlamaları olan), ancak sembolik bağlantı kullanıldığında ve çözümlendiğinde, bu dizenin göreceli bir yol olarak anlaşılması sembolik dizinin üst dizini (başlamadığı zaman /).


2
Güzel dedi. Bunu kendi cevabımı yazarken cevapladın. :)
Shadur

Sadece biraz farklı bir sorum vardı - ve bu mükemmel cevaplar. Ana dizine symlink'te nasıl referans verileceğini bilmek istedim, böylece bir kullanıcıdan diğerine aktardığımda çalışacaktı. Gibi bir şeyin ~işe yarayacağından emin değildim .
Joe,

"bu dize, sembolik bağın ana dizinine göreceli bir yol olarak anlaşılıyor" - bu her şeyi açıklıyor!
Bojan Komazec

24

Daha yeni coreutils kullanıyorsanız (coreutils-8.22-11 kullanıyorum), bunu yapma seçeneği vardır:

ln --help | grep relative

keyfi metin tutabilir; daha sonra çözümlenirse, göreceli bir link -r, --relative link konumuna göre sembolik linkler oluşturur.

Örneğin:

$ 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

Hm, benim için böyle bir seçenek yok gibi görünüyor -r. Mac kullanıyor olsa da.
ivkremer

1
@ivkremer bu seçeneğin şu anda mevcut olduğunu düşünüyor coreutils>> 8.16 (kaynak: superuser.com/a/837935/403979 )
DJCrashdummy

Göreceli bayrağını kullanmakla karşılaştığım “çok fazla sembolik bağlantı seviyesi” sorununu çözdüm.
Vix

12

Üzgünüm hayır. Sembolik bağlantılar, bağlantıyı oluştururken bulunduğunuz konuma değil, bağlantının bulunduğu konuma göre değişir. Bu davranışın birçoğu uzak dosya sistemlerini monte etmeyi gerektiren birkaç iyi nedeni vardır.


7

Pek symlinksçok Linux dağıtımında mevcut olan (aslında şu anda J. Brandt Buckley tarafından bakımı yapılan Mark Lords tarafından) adlı küçük bir yardımcı program var .

Bir dizindeki tüm mutlak sembolik bağları göreceli olarak dönüştürmek için:

symlinks -c /path/to/directory

Maalesef, tek bir bağlantıyı dönüştürme seçeneği yoktur, önce onu kendi dizinine taşımalısınız.

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

Teşekkürler. geçerli sembolik bağlar github . J. Brandt Buckley tarafından sağlanmıştır. v1.4.3 .
Evgeny Vereshchagin

3

Deneyebilirsin:

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

Ancak, mutlak yol adıyla sembolik bir bağ kurar. Metinsel sorunuz, göreceli yol adından bahsediyor ...

Normal olarak, göreceli bir yol adı istediğiniz şeydir ve size verendir ln -s. Sanırım istediğin şey:

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

1

En yaygın mermiler yolları genişlettiğinden, göreceli bir sembolik bağlantı oluşturmak için "kaynak yol" dan alıntı yapmanız gerekir.

Ayrıca, -sparametre anlamına gelir --symbolic. lnvarsayılan olarak sert bağlantılar oluşturur.

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

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

0

Eğer bağlama noktalarınızın değişme ihtimali olmadığından eminseniz, böyle bir bash kabuğunda yapmaya çalıştığınız şeyi elde edebilirsiniz:

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

Bu, sembolik bağ kurarken hedef dizinde olduğunuzu varsayar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.