51 votes

Comment puis-je détecter si un lien symbolique est rompu dans Bash ?

J'exécute find et parcourt les résultats avec [ \( -L $F \) ] pour collecter certains liens symboliques.

Je me demande s'il existe un moyen simple de déterminer si le lien est rompu (pointe vers un fichier inexistant) dans ce scénario.

Voici mon code :

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

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

53voto

Roger Points 166
# test if symlink is broken (by seeing if it links to an existing file)
if [ ! -e "$F" ] ; then
    # code if the symlink is broken
fi

33voto

Shawn Chin Points 29756

Cela devrait imprimer les liens brisés :

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

Vous pouvez également enchaîner les opérations à la commande find , par exemple en supprimant le lien rompu :

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

8voto

Aquarius Power Points 242

cela fonctionnera si le lien symbolique pointait vers un fichier ou un répertoire, mais est maintenant cassé

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

4voto

Andrew Schulman Points 1946

readlink -q échouera silencieusement si le lien est mauvais :

 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

3voto

ACyclic Points 718

Ceci trouve tous les fichiers de type "lien", qui se résout également en un type "lien". c'est à dire. un lien symbolique cassé

 find /target -type l -xtype l

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X