#!/bin/bash
# broken-link.sh
# Écrit par Lee bigelow <ligelowbee@yahoo.com>
# Utilisé dans le guide ABS avec son autorisation.

#  Un pur script shell pour trouver des liens symboliques morts et les afficher
#+ entre guillemets pour qu'ils puissent être envoyés à xargs et être ainsi mieux
#+ gérés :) 
#  eg. sh broken-link.sh /repertoire /autrerepertoire|xargs rm
#
#  Néanmoins, ceci est une meilleure méthode :
#
#  find "repertoire" -type l -print0|\
#  xargs -r0 fichier|\
#  grep "lien symbolique mort"|
#  sed -e 's/^\|: *lienmort.*$/"/g'
#
#+ mais cela ne serait pas du bash pur.
#  Attention au système de fichiers /proc et aux liens circulaires !
##############################################################


#  Si aucun argument n'est passé au script, initialise repertoires au répertoire
#+ courant. Sinon, initialise repertoires aux arguments passés.
###############################################################

[ $# -eq 0 ] && repertoires=`pwd` || repertoires=$@

#  Configure la fonction verifliens pour vérifier si le répertoire en argument
#+ ne contient pas de liens morts et pour les afficher.
#  Si un des éléments du répertoire est un sous-répertoire, alors envoie ce
#+ sous-répertoire à la fonction verifliens.
############################################

verifliens () {
    for element in $1/*; do
    [ -h "$element" -a ! -e "$element" ] && echo \"$element\"
    [ -d "$element" ] && verifliens $element
    # Bien sûr, '-h' teste les liens symboliques, '-d' les répertoires.
    done
}

#  Envoie chaque argument qui a été passé au script à la fonction verifliens
#+ s'il s'agit d'un répertoire validé. Sinon, affiche un message d'erreur et
#+ le message d'usage.
######################
for repertoire in $repertoires; do
    if [ -d $repertoire ]
	then verifliens $repertoire
	else 
	    echo "$repertoire n'est pas un répertoire"
	    echo "Usage: $0 repertoire1 repertoire2 ..."
    fi
done

exit $?
