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
# 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 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 {} \;
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
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
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
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
Quel est le problème avec:
file $f | grep 'broken symbolic link'