4 Stimmen

Löschen eines defekten Links Unix

Ich möchte einen defekten Link löschen, aber vorher möchte ich überprüfen, ob die Link-Datei im Verzeichnis vorhanden ist. Nennen wir den Link A :

if [ -a A ] then 
  print 'ya A is ther'
fi

Aber wenn A ein defekter Link ist, wie kann ich das überprüfen?

4voto

find -L -type l findet defekte symbolische Links. Vergewissern Sie sich zunächst, dass es sich bei der Datei nicht um ein Verzeichnis oder einen symbolischen Link auf ein Verzeichnis mit test -d (wenn es ein Verzeichnis ist, find würde darin rekursieren). Daher:

is_broken_symlink () {
    case $1 in -*) set "./$1";; esac
    ! [ -d "$1" ] && [ -n "$(find -L "$1" -type l)" ]
}

Dies ist anfällig für eine Race Condition, wenn sich der Link zwischen dem Aufruf von test und die Aufforderung an find . Ein alternativer Ansatz besteht darin, zu sagen find nicht zu rekursieren.

is_broken_symlink () {
    case $1 in -*) set "./$1";; esac
    [ -n "$(find -L "$1" -type l -print -o -prune)" ]
}

1 Stimmen

Siehe diese Antwort auf unix.stackexchange.com, die erklärt, warum die Verwendung von find -L Diese zu finden und zu löschen, könnte gefährlich sein: unix.stackexchange.com/a/38691

0 Stimmen

@OgrePsalm33 In der Tat, danke für den Fehlerbericht. Es gibt eine Möglichkeit, die find -L ohne jedoch zu rekursieren, mit -prune . Siehe meine Bearbeitung.

2voto

John Kugelman Punkte 327535
if readlink -qe A > /dev/null; then
    echo "link works"
fi

0 Stimmen

Beachten Sie, dass dies die (neueren) GNU coreutils voraussetzt. Es gibt Unix-Systeme ohne ein readlink Befehl oder mit einem readlink Befehl, der verschiedene Optionen benötigt.

0voto

John Carter Punkte 52192

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X