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

Je lance find et parcourt les résultats avec [ ( -L $F ) ] pour collecter certains liens symboliques.

Je me demande s'il existe un moyen facile de déterminer si le lien est brisé (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
39
demandé sur Te Ri 2011-11-08 14:39:16

6 réponses

# test if file exists (test actual file, not symbolic link)
if [ ! -e "$F" ] ; then
    # code if the symlink is broken
fi
43
répondu Roger 2014-09-09 16:15:50

Cela devrait imprimer les liens qui sont cassé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 brisé:

find /target/dir -type l ! -exec test -e {} \; -exec rm {} \;
28
répondu Shawn Chin 2011-11-08 11:30:45

readlink -q échoue 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
7
répondu Andrew Schulman 2011-11-08 11:01:48

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
5
répondu Aquarius Power 2014-05-04 23:46:52

Cela trouve tous les fichiers de type "link", qui se résout également en un type "link". IE. un lien symbolique cassé

find /target -type l -xtype l
3
répondu ACyclic 2014-05-24 13:02:00

Si cela ne vous dérange pas de parcourir les liens symboliques dir non cassés, pour trouver tous les liens orphelins:

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

Pour trouver tous les fichiers qui ne sont pas des liens orphelins:

$ find -L /target ! -type l
2
répondu William Pursell 2015-06-24 14:22:45