Una versión aún más general que permite usar find
opciones:
#!/bin/bash
set -e
path="$1"
shift 1
while [[ $path != / ]];
do
find "$path" -maxdepth 1 -mindepth 1 "$@"
# Note: if you want to ignore symlinks, use "$(realpath -s "$path"/..)"
path="$(readlink -f "$path"/..)"
done
Por ejemplo (suponiendo que el script se guarda como find_up.sh
)
find_up.sh some_dir -iname "foo*bar" -execdir pwd \;
... imprimirá los nombres de todos some_dir
los antepasados (incluido él mismo) hasta /
que se encuentre un archivo con el patrón.
Cuando utilice readlink -f
el script anterior, seguirá los enlaces simbólicos en el camino, como se señala en los comentarios. En su realpath -s
lugar, puede usar , si desea seguir rutas por nombre ("/ foo / bar" irá a "foo" incluso si "bar" es un enlace simbólico); sin embargo, eso requiere una instalación realpath
que no está instalada de forma predeterminada en La mayoría de las plataformas.