it-swarm-tr.com

Göreli bir yol adına sembolik bağlantı yapma

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

Ama 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ü? Bir şekilde göreceli yol adını çözebilir ve ln adresine aktarabilir miyim?

65
Humphrey Bogart

Göreli bir yola sembolik bir bağlantı oluşturursanız, bunu örneğinizin gösterdiği gibi mutlak değil, göreli bir sembolik bağlantı olarak saklar. Bu genellikle iyi bir şeydir. Dosya sistemi başka bir yere monte edildiğinde mutlak sembolik bağlantılar çalışmaz.

Örneğinizin çalışmamasının nedeni, ln öğesinin çalıştırıldığı yerde değil, sembolik bağlantının üst dizinine göreli olmasıdır.

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

ln -s 'Den sonraki ilk bağımsız değişkenin, sembolik bağlantının hedefi olarak saklandığını anlamak önemlidir. Herhangi bir rastgele dize olabilir (boş olamayacağı ve NUL karakterini içeremediği tek kısıtlamalarla), ancak symlink'in kullanıldığı ve çözüldüğü sırada, bu dize, Symlink'in üst dizini (/ ile başlamadığında).

66
penguin359

Daha yeni coreutils kullanıyorsanız (coreutils-8.22-11 kullanıyorum), bunu yapmak için bir seçenek vardır:

ln --help | grep relative

keyfi metin tutabilir; daha sonra çözümlenirse, göreli bir bağlantı -r, --lelatif bağlantı konumuna göre sembolik bağlar 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
25
ptr

Ü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öredir. Bu davranışın birçoğu uzak dosya sistemlerini monte etmeyi içeren birkaç iyi nedeni vardır.

12
Shadur

Birçok Linux dağıtımında bulunan symlinks (aslen Mark Lords tarafından şu anda J. Brandt Buckley tarafından sürdürülmektedir) adında küçük bir yardımcı program var.

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

symlinks -c /path/to/directory

Ne yazık ki, tek bir bağlantıyı dönüştürme seçeneği yoktur, önce onu kendi dizinine taşımanız gerekir.

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

Deneyebilirsiniz:

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

Ancak, mutlak yol adına sembolik bir bağlantı kurar. Metin sorunuz şu göreli yol adından bahsediyor ...

Normalde, göreli bir yol adı istediğiniz şeydir ve ln -s sana verir. Bence ne istiyorsun:

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

En yaygın kabuklar yolları genişlettikçe, göreli bir sembolik bağlantı oluşturmak için "kaynak yolu" nu belirtmeniz gerekir.

Ayrıca -s parametresi --symbolic. ln varsayılan olarak sabit 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
1
emp.justine

Bağlama noktalarınızın değişme şansı olmadığından eminseniz, böyle bir bash Shell'de yapmaya çalıştığınız şeyi şöyle elde edebilirsiniz:

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

Bu, sembolik bağlantı yaparken hedef dizinde olduğunuzu varsayar.

0
mreff555