it-swarm-tr.com

Bir sürü bozuk simgeyi nasıl "yeniden bağlayabilirim"?

/home Altındaki dosyalara bir grup sembolik bağlantı içeren bir dizin ağacı var ... Ancak, /home İçin /mnt/home Taşındı ve "yeniden bağlamak" için bir yol gerekir tüm simgeler. Bu tür bir işlevsellik var mı yoksa bunu yapmak için bir komut dosyası yazmam gerekiyor mu?

Örnek olarak, aşağıdaki gibi bir şey var:

[[email protected] ~]# ls -l /mnt/home/someone/something
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/e

/mnt/home/someone/something/subdir:
total 4264
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 a -> /home/someone/someotherthing/subdir/a
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 b -> /home/someone/someotherthing/subdir/b
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 c -> /home/someone/someotherthing/subdir/c
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 d -> /home/someone/someotherthing/subdir/d
lrwxrwxrwx 1 jnet www-data      55 2011-08-07 13:50 e -> /home/someone/someotherthing/subdir/e

Tüm simgeleri bulup aynı yerlere yeniden bağlayacak bir komut istiyorum ama /mnt/home Yerine /home Altında

Böyle bir komut var mı?

55
Josh

Sembolik bir bağlantıyı yeniden hedeflemek için bir komut yoktur, yapabileceğiniz tek şey onu kaldırmak ve başka bir bağlantı oluşturmaktır. GNU yardımcı programlarınız (ör. Yerleşik olmayan Linux veya Cygwin altında) bulunduğunu varsayarsak, -lnamefind birincil sembolik bağlantıları hedeflerine göre ve readlink bağlantının içeriğini okumak için. Test edilmemiş:

find /mnt/home/someone/something -lname '/home/someone/*' \
     -exec sh -c 'ln -snf "/mnt$(readlink "$0")" "$0"' {} \;

Bu sembolik bağları göreceli yapmak daha iyi olur. Birçok Linux dağıtımında bulunan symlinks (aslen Mark Lords tarafından şu anda J. Brandt Buckley tarafından sürdürülmektedir) adında küçük bir yardımcı program var. Taşıma işleminden önce veya yukarıdaki gibi geçerli bağlantıları geri yükledikten sonra symlinks -c /mnt/home/someone/something belirtilen dizin altındaki tüm mutlak simgeleri bir dosya sistemi sınırını aşmadıkça göreli simgelere dönüştürmek için.

Bunun tam olarak yazarın talep ettiği şey olmadığını biliyorum, ancak zaten cevapları var gibi görünüyor, bu yüzden soruyu tökezleyen benim gibi diğerleri için ekliyorum.

Aşağıdakiler, sembolik bağlantının hedeflerinin bir kısmı değiştirilerek düzeltilebilen bir grup kırık sembolik bağa sahip olmak gibi daha esnek bir çözüm gerekiyorsa yardımcı olacaktır.

örneğin. Bir kullanıcı adı değişikliğinden sonra, taşıma zaten yapıldıktan sonra eski kullanıcı adını birçok bağlantının hedefindeki yeni kullanıcı adıyla değiştirmek. Aşağıda gösterilen replace-simlinks adlı bir komut dosyası oluşturun:

#!/bin/bash
link=$1
# grab the target of the old link
target=$(readlink -- "$1")

# replace the first occurrence of oldusername with newusername in the target string
target=${target/oldusername/newusername}

# Test the link creation
echo ln -s -- "$target" "$link"

# If the above echo shows the correct commands are being issued, then uncomment the following lines and run the command again
#rm "$link"
#ln -s "$target" "$link"

ve aşağıdaki komutla çağırın:

find /home/newusername/ -lname '/home/oldusername/*' -exec ~/bin/replace-simlinks {} \;

Umarım bu birine yardım eder

edit: Bu komut dosyası ve linkler göreli hale getirmek için sembolik komut dosyası kullanma hakkında ipucu için teşekkürler Gilles.

13
Gerry

Oluşturmak /home/mnt/home ve mevcut tüm semboller tekrar geçerli olacaktır.

4
Keith Thompson