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
6 réponses
# test if file exists (test actual file, not symbolic link)
if [ ! -e "$F" ] ; then
# code if the symlink is broken
fi
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 {} \;
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
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
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
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