2011-11-08 16 views
35

Uruchamiam find i przeglądam wyniki z [ \(-L $F \) ], aby zebrać określone dowiązania symboliczne.Jak wykryć, czy dowiązanie symboliczne jest uszkodzone w Bash?

Zastanawiam się, czy istnieje prosty sposób określenia, czy link jest uszkodzony (wskazuje na nieistniejący plik) w tym scenariuszu.

Oto mój kod:

FILES=`find /target/ | grep -v '\.disabled$' | sort` 

for F in $FILES; do 
    if [ -L $F ]; then 
     DO THINGS 
    fi 
done 

Odpowiedz

39
# test if file exists (test actual file, not symbolic link) 
if [ ! -e "$F" ] ; then 
    # code if the symlink is broken 
fi 
+0

Pamiętaj, że kod zostanie również wykonany, jeśli plik w ogóle nie istnieje. Jest dobrze z 'find', ale w innych scenariuszach (takich jak globs) należy połączyć z -h, aby obsłużyć tę sprawę, na przykład' [-h "$ F" -a! -e "$ F"] '. – Calimo

+0

Naprawdę nie testujesz dowiązania symbolicznego z tym podejściem. –

+0

@ Calimo Nie ma różnicy. – Melab

7

readlink -q zawiedzie dyskretnie jeśli link jest zły:

for F in $FILES; do 
    if [ -L $F ]; then 
     if readlink -q $F >/dev/null ; then 
      DO THINGS 
     else 
      echo "$F: bad link" >/dev/stderr 
     fi 
    fi 
done 
+0

wydaje się to całkiem niezłe, ponieważ zwraca tylko wartość true, jeśli plik jest w rzeczywistości dowiązaniem symbolicznym. Ale nawet po dodaniu -q, readlink wypisze nazwę linku na linuxie. Jeśli tak jest w ogóle, być może odpowiedź powinna zostać zaktualizowana za pomocą "readlink -q $ F> dev/null". Czy może czegoś brakuje? – zoltanctoth

+1

Nie, masz rację. Poprawione, dzięki. –

+0

Która wersja? Nie widzę takiego zachowania w moim systemie readlink --version readlink (coreutils) 5.2.1 –

26

ten powinien wydrukować linki, które są łamane:

find /target/dir -type l ! -exec test -e {} \; -print 

Możesz również połączyć w operacje na polecenie find, np. usuwanie niedziałający link:

find /target/dir -type l ! -exec test -e {} \; -exec rm {} \; 
2

Jeśli nie przeszkadza przejeżdżające non-złamane reż dowiązania, aby znaleźć wszystkie osierocone linki:

 
$ find -L /target -type l | while read -r file; do echo $file is orphaned; done 

Aby znaleźć wszystkie pliki, które nie są osierocone linki:

 
$ find -L /target ! -type l 
+1

Ale wynika to z niezłamanych dowiązań symbolicznych do katalogów, których możemy nie chcieć. – rafak

5

to będzie działać, jeśli dowiązanie wskazywał do pliku lub katalogu, ale teraz jest uszkodzony

if [[ -L "$strFile" ]] && [[ ! -a "$strFile" ]];then 
    echo "'$strFile' is a broken symlink"; 
fi 
2

Spowoduje to wyszukanie wszystkich plików typu "link", który również przechodzi do typu "link". to znaczy. zepsuty symlink

find /target -type l -xtype l 
+1

Wariant: 'find -L/target -type l' – cdelacroix

+0

Czy nie masz dowiązania symbolicznego do dowiązania symbolicznego, które nie jest zepsute?" –

Powiązane problemy