İki göreceli yolu olan bash'te bir sembolik bağlantı oluşturun


2

Evime iki rehber vardır: ~/dir1ve ~/dir2ilk bir dosyayla: ~/dir1/file.txtBen bu siteye link edin bir yolu var mı ~/dir2hiç hareket ettirmeden ~/ve eğer neden durumda olmasıdır?

Kaçmayı denedim ~/:

$ ln -s ./dir1/file.txt ./dir2/file.txt

ama beklediğim gibi, bu sonuçta ortaya çıkan sembolik bağlantının etkili bir şekilde işaret etmesine neden oluyor ~/dir1/dir2/file.txtama aslında istediğim şey değil.

Ben de denedim:

$ ln -s ./dir1/file.txt ../dir2/file.txt

Hangi döner:

ln: failed to create symbolic link `../dir2/file.txt': No such file or directory

Bunun sadece ~/dir2/file.txtişaret eden bir sembolik bağlantı oluşturmasını bekliyorum .~/../dir1/file.txt

Yani benim asıl sorum şu: lnSanırım var olmadığını düşündüğü bir dosyaya bir link vermek için zorlayabilir miyim ?

Düzenleme: Elde etmeye çalıştığım şeye daha fazla açıklık getirmek için, ana dizinden etkin bir şekilde yapabilecek tek bir komut istiyorum:

pushd dir2/ && ln -s ../dir1/file.txt && popd

ya da Python'da (bu istediğime geldiğim en yakın şey):

echo "import os; os.symlink('../dir1/file.txt', './dir2/file.txt')" | python

Yanıtlar:


2

İkisinden birini yapabilirsin

  1. Mutlak yollar kullan

    $ ln -s ~/dir1/file.txt ~/dir2
    $ readlink dir2/file.txt 
    /home/terdon/dir1/file.txt
    
  2. Doğru göreceli yolları kullanın

    $ ln -s ../dir1/file.txt dir2/
    $ readlink dir2/file.txt 
    ../dir1/file.txt
    

Kullanım durumunuza bağlı olarak, biri diğerinden daha iyi olabilir. Sadece göreceli yolları kullanarak bağlantılar oluştururken, yolların geçerli konumunuza değil hedefe göre olması gerektiğini unutmayın.


Cevabınız için teşekkürler. Kesin yollarım olsaydı ilk öneriniz işe yarayacak, ancak özellikle göreceli yollarla ilgileneceğim. İkinci öneriniz ikinci girişimde bulunduğum komutla eşanlamlı (hedef dosya adının eksik olması) ancak ilk argüman üzerinde hata bulunamadı (yukarıya bakın) bir dosya aldım . Hangi linux dağıtımını kullandığınızı sorabilir miyim?
nettux,

@ nettux443 ha, bu garip. LMDE (temelde Debian testi) ve bash 4.2.45. İkinci önerimin sizinkiyle aynı olmadığını unutmayın . Sen kullandın ./dirve ben kullanıyorum ../dir. Fikir, yolun hedefe göre olması gerektiğidir. Bağlantının adını dahil etmek istiyorsanız ln -s ../dir1/file.txt ~/dir2/foo, yine de işe yarayacak olanı kullanın . Aynı zamanda nerede olduğunuza bakmaksızın çalışacaktır. Ben sadece yukarıdaki denedim /etcve doğru ~/dir2/fooişaret eden bir dosya oluşturdu ~/dir1/file.txt.
terdon

@ nettux443 no, lnyalnızca oluşturduğu dosyanın var olup olmadığını denetler. Hedefin gerçek olduğundan emin olmak senin işin. Bu örneğin bir hata vermeyecektir:, ln -s /fruble/bargle/bob /tmp/foomutlu ve sessiz bir şekilde kırık bir bağlantı oluşturacaktır.
terdon

Üzgünüm haklısınız, ikinci cevabınız önerinizle aynı değil. Sorun burada yatıyor. Önerin, denemek istediğim şeydi .... umarım yine bu hatayı yapmaz!
nettux,

@ nettux443 lol, bize en iyisi olur :)
terdon

2

Sorunuz biraz kafa karıştırıcı.

  1. Siz sordunuz "Ben bu siteye link edin bir yolu var mı ~/dir1[...]?" Sanırım ~/dir2gönderinin geri kalanına bağlı olarak "dan " demek istedin?

  2. İlk emrin

    $ ln -s ./dir1/file.txt ./dir2/file.txt

    düşündüğünüzü yapmaz. Hala ev dizininizde bulunduğunuzu varsayalım, yukarıdaki komut kendi yolu olan bir sembolik bağlantı oluşturur ~/dir2/file.txtve bu sembolik bağlantı yolu kelimenin tam anlamıyla yola işaret eder ./dir1/file.txt. Bahsedilen sembolik bağlantı dizinde bulunduğundan ~/dir2, bu tür hedef yolu çözülür ~/dir2/./dir1/file.txt, ki bu da çözülür ~/dir2/dir1/file.txt(muhtemelen var olmayan ve ne istediğinizi değil). Bu yüzden neden çözüldüğünü söylediğinden şüpheliyim ~/dir1/dir2/file.txt.

  3. 2. komutunuz başarısız oluyor, çünkü ../dir2sembolik bağın yerleştirileceği bir dizin yok ve hata mesajının anlamı buydu.

  4. Sorunuza cevap vermek için evet. İşletim sistemi, bağlantınızın geçerli bir dosya sistemi nesnesi bulunmayan bir yola işaret edip etmediğini önemsemez.

Muhtemelen gerçekten istediğin gibi bir şey

ln -s ../dir1/file.txt ./dir2/file.txt

Sanırım? Bu komut, kendi yolu olan bir sembolik bağlantı oluşturur ./dir2/file.txtve hedefi, gerçek bağıl yoldur ../dir1/file.txt. Nihai, mutlak yol sembolik link olduğuna işaret ettiği ~/dir2/../dir1/file.txtiçin giderir, hangi ~/dir1/file.txt.

Not ~sembol ev dizininin mutlak yolunu şeklinde genişleyen kabuk genişletilebilir bir karakterdir. ~Genişleme, OS yolu çözünürlüğünün bir parçası değildir.

Önerilen Okuma

Linux Elyordamsayfalarının path_resolution(7), symlink(7), ln(1)ve ln(1p).

Düzenle

Açıklamalar ve önerilen okumalar.


Neden ilk komutumun işe yaramadığını, çalışmayı beklemiyordum, ama deneyeceğimi düşündüm. İkinci komut, bağlantıyı kurmaya zorlayabilseydim işe yarayacaktı. Önerilen komutun argümanlarının yanlış yol olduğuna dikkat edin. ln -s /path/to/file /path/to/new/linkYazdığınız emir (geriye doğru !!) ~/dir1/file.txtişaret eden bir link vermeye çalışıyor ~/dir2/file.txt:)
nettux

elde etmeye çalıştığım şey hakkında daha ayrıntılı bilgi için düzenlenen soruma bakın.
nettux,
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.