sembolik bir bağlantı hedefinin güncellenmesi (ln -f -s çalışmıyor)


45

kullanıyorum

-n -s / var / www / html / bültenleri / build1390 uygulama akımı

"app-current" sembolik bağlantısını yeni bir hedefle güncellemek için. Ancak, bu işe yaramazsa, "app-current" bağlantısı orijinal hedefi tutar, ancak hiçbir hata alamıyorum ...

Bağlantıyı kaldırmak ve yeniden oluşturmak istemiyorum, sadece mevcut bir bağlantının hedefini güncelleyin. Mümkün mü?

Yanıtlar:


55

Bu benim için çalışıyor, çıktısı strace ln -f -s /var/www/html/releases/build1390 app-currentnedir?

Oh, bu bir zorunluluk olmadan eklemeniz gereken bir dizin olduğundan -nve bu sorunu çözmelidir. -fgerçekten çok daha fazla kolaylık sağlıyor çünkü -f'yi eklemek yine de bağlantının kopmasına neden oluyor. Her ne kadar normal yüklü bir sistemde birkaç yüz ms daha hızlı olacağını tahmin etsem de.

Örneğin, eğer arf zaten / home'u gösteriyorsa:

Strace -n: ile

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

Olmadan strace -n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

Öyleyse -narf onaysız kaldığı için , sanki gerçekte olduğu gibi arf gibi davranır /. Özel örneğinizde, eğer bir hata yoksa, muhtemelen içinde yeni bir sembolik bağlantı oluşturduğunuzu /var/www/html/releases/build1390 app-currentve bunu temizlemek isteyeceğinizi düşünüyorum.


4
harika, bunu yapan -n. Çok teşekkürler!
solsol

12

Hedefin, bir işaret bağlantısı olması durumunda başvurunun kaldırılmasını önlemek için -nveya kullanabilirsiniz --no-dereference. Hedef dosyanın her zaman normal bir dosya olarak değerlendirileceğinden emin olmak için -Tveya kullanabilirsiniz .--no-target-directory

Bunlar, aşağıdaki örnekte gösterildiği gibi, biraz farklı davranışlar sağlar. Diyelim ki srcbir dosya, dirlinkbir dizine bir bağlantı ve dirgerçek bir dizin.

Kullanarak -n:

  • ln -sfn src dirlinküzerine yazar dirlinkvesrc
  • ln -sfn src dir bağlantı oluşturur dir/src -> src

Kullanarak -T:

  • ln -sfT src dirlinküzerine yazar dirlinkvesrc
  • ln -sfT src dir bir hata mesajı veriyor: ln: ‘dir’: cannot overwrite directory

1
Linux kullanıcıları için en doğru ve özlü cevaba sahiptir.
ross

Hata mesajını alamayacağınız hedef dizinin üzerine yazmaya zorlamanın bir yolu var mı cannot overwrite directory?
gitaarik

@rednaw Bunu birkaç komut zincirleyerek yapabilirsiniz, ancak lndizinleri kaldırmaz - bu muhtemelen kötü bir fikirdir, çünkü muhtemelen çok sayıda dosyayı tekrar tekrar kaldırmanız gerekir.
ağustos
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.