La fonction rewindfind permet, à partir d'un point donné de l'arborescence, de rechercher un fichier en remontant cette arborescence.
Cette fonction peut être utilisée dans le cadre de projets ayant une arborescence complexe avec héritage de comportements (des sous-dossiers pouvant hériter du comportement d’un de leurs ancêtres, pas nécessairement de leur parent direct).
À partir d’un fichier ou répertoire, la fonction rewindfind
va remonter de père en père pour trouver la trace d’un éventuel fichier particulier (par exemple un gabarit ou des méta-données à appliquer par défaut).
Cette fonction n’opère aucun changement de répertoire, elle n’a donc aucun effet de bord sur l’appelant.
# Search for a file in parent directories of a file or a directory
# $1=file or directory to search from
# $2=file to look for
function rewindfind {
# Get an absolute path from the element given as parameter
directory=$(readlink -e "$1")
filename="$2"
# If the element is not a directory, get its directory
test -d "$directory" || directory=$(dirname "$directory")
# Goes up to the root of the filesystem if needed
while [ "$directory" != "/" ]
do
# If the default.template file is here and readable, return it !
if [ -f "$directory/$filename" ]
then
echo "$directory/$filename"
return 0
fi
# The directory does not contain the default.template file, try in its
# parent
directory=$(dirname "$directory")
done
# File not found, returns an error
return 1
}