2010-09-03 3 views
3

Je souhaite supprimer un lien brisé, mais avant cela, je souhaite confirmer si le fichier de lien est présent dans le répertoire. Appelons le lien A:Suppression d'un lien brisé Unix

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

Mais si A est un lien cassé alors comment puis-je vérifier?

Répondre

4

find -L -type l trouve des liens symboliques brisés. Tout d'abord, confirmez que le fichier n'est pas un répertoire ou un lien symbolique vers un répertoire avec test -d (si c'est un répertoire, find se recurcirait dedans). Ainsi:

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

Ceci est sujette à une condition de course, si le lien entre les changements de l'appel à test et l'appel à find. Une approche alternative consiste à dire find de ne pas recurcir.

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

Voir cette réponse unix.stackexchange.com pourquoi utiliser 'find -L' pour trouver et supprimer ceux-ci pourrait être dangereux: http://unix.stackexchange.com/a/38691 –

+0

@ OgrePsalm33 En effet, merci pour le rapport de bug . Il y a un moyen d'utiliser 'find -L' sans récurer, en utilisant' -prune'. Voir ma modification. – Gilles

2
if readlink -qe A > /dev/null; then 
    echo "link works" 
fi 
+0

Notez que cela suppose (à date récente) des coreutils GNU. Il y a des systèmes unix sans une commande 'readlink', ou avec une commande' readlink' qui prend différentes options. – Gilles

Questions connexes