Bir sembolik bağlantı nasıl geçersiz kılınır / güncellenir?


188

Sembolik linkler kullanmaya çalışıyorum. Biraz okudum ve aşağıdaki komutları buldum:

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

Kreasyonlar ve silme işlemleri iyi sonuç verir. Ancak güncellemeler çalışmıyor. Bu komutu uyguladıktan sonra sembolik bağlantı geçersiz hale gelir.

Burada okudum ve orada bir sembolik bağlantının güncellenmesinin / geçersiz kılınmasının mümkün olmadığını. Yani internette çelişkili bilgiler var. Kim haklı? Bir link link güncellenebilir / geçersiz kılınabilirse, bunu nasıl başarabilirim?

Güncelleme

İşte benim dizin yapısı:

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

Gönderen ~/scripts/test/ben gerçekleştirdiğinizde,:

ln -s /remote_loc/site1 test_link

a test_linkyaratıldı ve yapabilirim ls -l, ama kırılmış gibi görünüyor (soruma yukarıda söylediklerimin aksine).

Birden çok dizin seviyesi bağlantısını nasıl yapabilirim?


1
Bunun unlinkyerine kullanmanızı öneririm rm. İle unlinksize yanlışlıkla yanlış anahtarları kullanarak bir kaynak dizindeki tüm dosyaları kaybetmek asla riske.
Jpsy

Komutunuzda bir lider kullanıyorsunuz
Jamie Cook

Jpsy, unlink hakkındaki tavsiyelerin çok iyi olurdu , doğru olsaydı . Zzzz dokunmayı deneyin; zzzz bağlantısını kaldır. (Çağrıları kaldır, rm ile aynı olanı seç, ancak süslü seçenek yok ve özyineleme yok).
ctrl-alt-delor,

Neden kullanılır -n? (sorun olabilir). Ayrıca ln destekliyorsa -to zaman bu durumlar için, kullanabilir ve -Tya destination/diğer durumlar için.
ctrl-alt-delor

Yanıtlar:


150

Kullanımı -file lnöylesine sürece doğru izinlere sahip olarak, bu çalışması gerekir, zaten orada herhangi bir bağlantı üzerine yazacaktır ... Her zaman benim için çalışıyor. Hangi işletim sistemini kullanıyorsunuz?


Sorumu, sorunum hakkında daha fazla bilgi ile güncelledim.
Jérôme Verstrynge

Linux altındayım.
Jérôme Verstrynge

2
lnParametreleri değiştirirseniz , yapacağıma göre, -fanahtar var olan dosyalarınızı yok eder mi (bağlantı hedefleri)? Her iki durumda -ida, eğer biraz güvenlik istiyorsanız, (kullanıcıdan üzerine yazma isteyecektir) parametresini bizde bulabilirsiniz .
palswim

2
@palswim Bu SO gönderisi güvenli olduğunu belirtir çünkü -fsadece çağırır unlink()ve link()başlık altında: stackoverflow.com/a/1466570/157385 . Keşke doğru sırayı hatırlayabilsem!
Mike Branski

4
Çalışmıyor. İhtiyaçlar -n. Kabul edilen cevaba bakınız.
Shawn Welch

119

Tamam, hatamın nerede olduğunu buldum: birincisi /yola girmemeli.

Başka bir deyişle, sorularımdaki komutlar şöyle olmalıdır:

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

onun yerine

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

benim davamı düşünerek.


22
Bunun neden olduğu hakkında bazı ek bilgiler için, farklılıklardan biri relativeyoldur (baştaki / olmadan) ve diğeri absoluteyoldur (baştaki / ile). Bir Linux sistemini yönetiyorsanız, farklılıkları anlamanız KRİTİKtir. Örneğin arasındaki fark rm -rf ./*ve rm -rf /.*sen :) İşini korumak ya da değil karar verir
safado

5
Bu soruya cevap yok 'nasıl güncelleneceği / a sym bağlantısını overide'
Sirch

Ln -sfn {yol / dosya / dosya adı} {bağlantı adı} satırı yapar.
Jérôme Verstrynge

6
-n (--no-dereference), {link name} 'i linke tıklamak yerine normal bir dosya gibi ele alır. Bu bağlantı üzerinde işlem yapmanız gerektiğine göre, bu seçeneği kullanmamalısınız.
Feldoh

1
Bu cevap, -nsembol bağlantısını değiştirmek için kullanılan parametreli cevabı vurgulamalıdır .
Nick Tsai

12

İlk konu:

Senden alıntı:

Kreasyonlar ve silme işlemleri iyi sonuç verir. Ancak güncellemeler çalışmıyor. Bu komutu uyguladıktan sonra sembolik bağlantı geçersiz hale gelir.

Verilen dizin yapısındaki problem:

~ / komut dosyaları / test / ~ / komut dosyaları / test / remote_loc / ~ / komut dosyaları / test / remote_loc / site1 / ~ / komut dosyaları / test / remote_loc / site1 / stuff1.txt ~ / komut dosyaları / test / remote_loc / site2 / ~ / scriptler /test/remote_loc/site2/stuff2.txt ~ / komut dosyaları / test / remote_loc / site2 / ~ / komut dosyaları / test / remote_loc / site3 / stuff3.txt

ve komutu kullanarak:

ln -s /remote_loc/site1 test_link

$ PWD'nizde veya mevcut çalışma dizinde sembolik bir bağlantı oluşturduğundan veya / remote_loc / site1 adresindeki / veya kök dizininde olmayan bir dosyaya işaret ediyor.

PWD'niz ~ / scripts / içindeyse, bunu kullanmalıydınız:

ln -s remote_loc/site1 test_link

Aksi gibi tam mutlak yolu kullanabilirdi:

ln -s /home/yourusername/remote_loc/site1 test_link

İkinci sayı:

Senden alıntı:

Burada okudum ve orada bir sembolik bağlantının güncellenmesinin / geçersiz kılınmasının mümkün olmadığını. Yani internette çelişkili bilgiler var. Kim haklı? Bir link link güncellenebilir / geçersiz kılınabilirse, bunu nasıl başarabilirim?

"Kim haklıdır" sorunuzu yanıtlamak için tam olarak ne okuduğunuzdan veya nasıl anlaşıldığından emin değilim. Ancak, aşağıdakiler temizlemeye yardımcı olmalıdır:

  1. Ne güncellenebilir ve
  2. Uygun anahtarlar kullanmadan ne güncellenemez.


Sembolik bağların, dizin olmayan hedeflerle güncellenmesi.

ln -sf:
-f veya --force varolan hedef dosyaları kaldırır, Bu bir bağlantının hedefini veya hedefini güncellemek için kullanılır.

Örnek:

 ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

Ancak, görebileceğiniz gibi, mutlak yollar lnargümanlardaysa , mutlak yolu verecektir . Mevcut çalışma dizini, bağlantının üst dizinden farklı olduğunda tam yol verilmesi gerekir.


Göreceli Yollar:

ln -sfr:
-r veya --relative, bağlantının konumuna göre sembolik bağlantılar oluşturur.

Örnek:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

Ancak, hedef bir dizinse, bir dizine bağlantı güncellemek işe yaramaz.

Örnek:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:47 testdir.link -> testdir

Gördüğünüz gibi, lnyukarıdaki argümanında -r seçeneği olmadan verilen mutlak yol adlarını kullanmanıza rağmen , sembolik link hala linke göre.


Dizinlere Bağlantıları Güncelle:

ln -sfrn:
-n veya --no-dereference, bir dizine sembolik bir link ise, LINK_NAME uygulamasını normal bir dosya olarak kabul eder.

Örnek:

ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

Şununla karşılaştırıldığı gibi:

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir

6
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2

1 seviye dizinde testler yaptığımda çalışır, fakat çoklu seviye dizin kullanmaya çalışıyorum ve çalışmıyor. Sorumu güncelledim.
Jérôme Verstrynge
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.