İşaret bağlantılarını sert bağlantılara dönüştürme


25

Yumuşak bağlantıları tekrar tekrar dizindeki sabit bağlantılara dönüştürmek istiyorum. Böyle bir şey denedim:

for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done

… Ama iki ana sorunu var:

  • özyinelemeli değil
  • sembolik bağ olmayan dosyaları alır

Yukarıdaki çizgiyi bir şekilde beslemek güzel olurdu find -type l, ama nasıl yapacağımdan emin değilim.


1
Ayrıca bakınız [bu tartışma] [1] ( cp -aH). [1]: unix.stackexchange.com/questions/94185/…
Michael Shigorin

Yanıtlar:


34

Bu komut çalışması gerekir:

find -type l -exec bash -c 'ln -f "$(readlink -m "$0")" "$0"' {} \;

Nasıl çalışır:

  • find -type l Geçerli dizindeki tüm bağlantıları bulur.

  • -exec bash -c '...' {} \;yürütmek için bash çağırır ....

    Geçer {}- şu anda işlenmekte olan bağlantının adı - bash'ın erişebileceği bir argüman olarak $0.

  • readlink -m "$0" sembolik bağın hedefinin mutlak yolunu döndürür.

  • ln -f "$(readlink -m "$0")" "$0"hedefine sert bir -fbağlantı $0ile sembolik bağlantının üzerine yazar ( ) .

Bağlantı bir nedenden dolayı dönüştürülemezse, dokunulmadan kalır ve ln bir hata mesajı yazdırır.


Bu son paragrafa gelince, bashve arasındaki mutlak yolları belirtmek yeterli olmaz lnmı?
Daniel Beck

2
Benim sorunum, okuma bağlantısının varsayılan olarak göreceli bir yol döndürmesiydi, ancak -eanahtar bunu düzeltti.
Dennis,

OSX için komut ne olurdu?
Igor Markelov

@IgorMarkelov Üzgünüm, ama OSX konusunda hiçbir fikrim yok.
Dennis,

1
Mac'te: brew install coreutilsve find * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;.
Igor Markelov
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.