web-dev-qa-db-fra.com

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 facile 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
43
zoltanctoth
# test if file exists (test actual file, not symbolic link)
if [ ! -e "$F" ] ; then
    # code if the symlink is broken
fi
44
Roger

Cela devrait imprimer les liens rompus:

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

Vous pouvez également chaîner des opérations à la commande find, par exemple suppression du lien rompu:

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

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
7
Aquarius Power

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
6
Andrew Schulman

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

find /target -type l -xtype l
3
ACyclic

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

 $ find -L/target -type l | pendant la lecture du fichier -r; le fichier do echo $ est orphelin; terminé

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

 $ find -L/target! -type l 
2
William Pursell

Quel est le problème avec:

file $f | grep 'broken symbolic link'

0
Rew Brian