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


Sembolik linkleri kullanmaya çalışıyorum. Biraz okuma yaptım ve şu 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 delesyonlar iyi çalışıyor. Ancak güncellemeler çalışmıyor. Bu komutu uyguladıktan sonra sembolik link geçersiz olur.

Burada ve bir link bağlantısını güncellemenin / geçersiz kılmanın mümkün olmadığını okudum. Yani ağ üzerinde çelişkili bilgiler var. Kim haklı? Bir bağlantı linki güncellenebilir / geçersiz kılınabilirse, bunu nasıl başarabilirim?

Güncelleştirme

İşte dizin yapımız:

~/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

itibaren ~/scripts/test/, yaptığım zaman:

ln -s /remote_loc/site1 test_link

bir test_link oluşturuldu ve yapabilirim ls -l o, ama kırık görünüyor (benim soruda yukarıda söylediğim aksine).

Birden çok dizin düzeyinde bağlantıyı nasıl yapabilirim?


153
2018-05-17 12:39


Menşei


Kullanmamı tavsiye ederim unlink yerine rm. İle unlink Yanlış anahtar kullanarak yanlışlıkla bir kaynak dizindeki dosyaları kaybetme riski yoktur. - Jpsy
Emrinizde lider / kullanıyorsunuz - Jamie Cook
Bağlantıyı kesmekle ilgili tavsiyen çok iyi olur. eğer doğruyduysa. Dokunma zzzz deneyin; zzzz bağlantısını kes. (aramaların bağlantısını kes, rm ile aynı bağlantıyı kes, ancak hiçbir fantezi seçeneği yok ve yineleme yok). - ctrl-alt-delor
Neden kullanımı -n? (sorun olabilir). Ln'niz destekliyorsa -t sonra, bu durumlarda, ve -T veya destination/ diğer durumlar için. - ctrl-alt-delor


Cevaplar:


kullanma -f ile ln zaten var olan herhangi bir bağlantının üzerine yazacaktır, bu yüzden doğru izinlere sahip olduğunuz sürece çalışmalıdır ... Her zaman benim için çalışmıştır. Hangi işletim sistemini kullanıyorsunuz?


125
2018-05-17 12:49



Sorumu sorunum hakkında daha fazla bilgi ile güncelledim. - Jérôme Verstrynge
Ben linux sahibiyim. - Jérôme Verstrynge
Eğer değiştirirseniz ln Yapmaya eğilimli olduğum gibi parametreler -f varolan dosyalarınızı yok et (link hedefleri)? Her iki durumda da -i Biraz güvenlik istiyorsanız, parametreyi (kullanıcıya üzerine yazmak isteyecektir). - palswim
@palswim Bu SO gönderi güvenli olduğunu ima eder çünkü -f sadece aramalar unlink() ve link() kaputun altında: stackoverflow.com/a/1466570/157385. Keşke doğru siparişi hatırlıyorum olsa! - Mike Branski
Çalışmıyor. ihtiyaçlar -n. Kabul edilen cevaba bakınız. - Shawn Welch


Tamam, halimin nerede olduğunu buldum: ilk önce / yolunda.

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}

yerine

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

davamı düşünerek.


93
2018-05-17 13:32



Bunun neden olduğu hakkında bazı ek bilgiler için, farklar bir relative yol (önde / olmadan) ve diğeri absolute yol (önde /) ile. Bir Linux sistemi uyguluyorsanız, farklılıkları anlamanız KRİTİKTİR. Örneğin arasındaki fark rm -rf ./* ve rm -rf /.* işinizi sürdürüp sürdürmeme kararı verir :) - Safado
Bu 'sym bağlantısının nasıl güncelleneceğini / overide edeceğini' sorusuna cevap vermiyor - Sirch
Ln -sfn {path / to / dosya-adı} {link-name} satırı var. - Jérôme Verstrynge
Ne fark eder -n seçenek yapmak? - dokaspar
-n (--no-dereference), bağlantıyı takip etmek yerine {link name} 'i normal bir dosya gibi ele almasını sağlar. Bu linkte işlem yapmanız gerektiğini göz önünde bulundurmamak kaydıyla, bu seçeneği kullanmanız gerekir. - feldoh


İlk konu:

Alıntı yapmak:

Kreasyonlar ve delesyonlar iyi çalışıyor. Ancak güncellemeler çalışmıyor. Sonra   bu komutu gerçekleştirerek, sembolik link geçersiz olur.

Sorun, belirtilen dizin yapısıyla:

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

ve komutu kullanarak:

ln -s /remote_loc/site1 test_link

Bu, $ PWD'nizde sembolik bir bağ oluşturuyor mu, yoksa mevcut çalışma dizinini /, veya root, / remote_loc / site1 üzerinden var olmayan bir dosyaya gösteriyor mu?

PWD'niz ~ / scripts / içinde ise, o zaman bunu kullanmalısınız:

ln -s remote_loc/site1 test_link 

Başka bir şekilde tam mutlak yolu kullanmış olabilirsiniz:

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

İkinci konu:

Alıntı yapmak:

Burada okudum / geçersiz kılmak mümkün değil.   bir sembolik bağlantı. Yani ağ üzerinde çelişkili bilgiler var. Kim   sağ? Bir bağlantı linki güncellenebilir / geçersiz kılınabilirse, bunu nasıl başarabilirim?

"Kim doğru" sorunuzu cevaplamak için, tam olarak okuduğunuzdan veya nasıl anlaşıldığından emin değilim. Ancak, aşağıdakiler temizlenmelidir:

  1. Ne güncellenebilir ve
  2. Kullanmadan ne güncellenemez uygun anahtarlar.


Sembolik bağlantılar, dizin olmayan hedeflerle güncellenir.

ln -sf:
  -F veya --force hedef dosyaları kaldır, Bu bir linkin 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örebildiğiniz gibi, mutlak patikalar ise mutlak yolu verecektir. lnargümanlar. Mevcut çalışma dizini, bağlantının üst dizinden farklı olduğunda tam yol vermek gerekir.


Göreli yollar:

ln -sfr:
  -R veya --latif, 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 dizin ise, bir dizine bir bağlantının güncellenmesi çalışmayacaktır.

Ö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, verilen mutlak yol adlarını kullanmanıza rağmen ln-r seçeneği olmadan yukarıdaki argüman, sembolik bağlantı hala bağlantıya göreceli.


Bağlantıları Dizinlere Güncelleştir:

ln -sfrn:
  -N veya --no-dereference, bir dizine sembolik bir bağlantı olması durumunda LINK_NAME öğesini normal bir dosya olarak ele alır.

Ö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

Aksine olarak:

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

10
2018-06-08 22:58





$ 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

6
2018-05-17 12:42



1 düzey dizin ile testler gerçekleştirdiğimde çalışır, ancak çok seviyeli dizinleri kullanmaya çalışıyorum ve işe yaramıyor. Sorumu güncelledim. - Jérôme Verstrynge