Ben kuvvetle öneririm değil kullanmak find -L
görev için (açıklama için aşağıya bakınız). İşte bunu yapmanın başka yolları:
"Saf find
" bir yöntem kullanmak istiyorsanız , bunun yerine şöyle görünmelidir:
find . -xtype l
( xtype
dereferenced bir bağlantı üzerinde yapılan bir testtir) Bu, tüm sürümlerinde bulunmayabilir find
. Ancak başka seçenekler de var:
Ayrıca komutun test -e
içinden de yürütebilirsiniz find
:
find . -type l ! -exec test -e {} \; -print
Bazı grep
numaralar bile , (dosya isimleri de dahil olmak üzere tüm çıktı satırlarında sürtünen) soruda belirtilenden daha iyi (yani daha güvenli ) olabilir;find -L
find . -type l -exec sh -c 'file -b "$1" | grep -q ^broken' sh {} \; -print
find -L
Alıntılanan hüner solo ile gelen commandlinefu güzel ve hacky görünüyor, ama bir çok sahip tehlikeli hatadır : Tüm sembolik bağ izlenir. Aşağıda sunulan içerikleri içeren dizini göz önünde bulundurun:
$ ls -l
total 0
lrwxrwxrwx 1 michal users 6 May 15 08:12 link_1 -> nonexistent1
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_2 -> nonexistent2
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_3 -> nonexistent3
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_4 -> nonexistent4
lrwxrwxrwx 1 michal users 11 May 15 08:20 link_out -> /usr/share/
Bu find -L . -type l
dizinde koşarsanız, hepsi /usr/share/
de aranır (ve bu gerçekten uzun sürebilir) 1 . "Giden bağlantılara bağışıklık" olan bir find
komut için kullanmayın-L
.
1 Bu ufak bir rahatsızlık gibi görünebilir (bu komut, "sadece" tümünden geçmek için uzun zaman alacaktır /usr/share
) - ancak daha ciddi sonuçlar doğurabilir. Örneğin, chroot ortamlarını düşünün: Ana dosya sisteminin bazı alt dizinlerinde var olabilir ve mutlak konumlara sembolik bağlantılar içerebilir. Bu bağlantılar “dış” sistem için kopmuş gibi görünebilir, çünkü chroot'a girdikten sonra sadece uygun yerlere işaret ederler. Ayrıca, bazı bootloader'ların /boot
, başlangıç bölümü olarak monte edildiğinde, sadece başlangıçtaki bir başlangıç aşamasında anlamlı olan sembolik bağlantılar kullandığını hatırlıyorum /
.
Bu yüzden, find -L
zararsız görünen bir dizinden bozuk linkleri bulmak ve silmek için bir komut kullanırsanız , sisteminizi bile bozabilirsiniz ...
-type l
gereksizdir, çünkü bağlantı dışı-xtype l
olarak çalışacak-type l
. Yanifind -xtype l
muhtemelen tüm ihtiyaç vardır. Bu yaklaşım için teşekkürler.