Parcours inverse d'arborescence en Bash

La fonction rewindfind permet, à partir d'un point donné de l'arborescence, de rechercher un fichier en remontant cette arborescence.

Intérêt

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.

Code source

# 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
}