Uma versão ainda mais geral que permite o uso de find
opções:
#!/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 exemplo (supondo que o script seja salvo como find_up.sh
)
find_up.sh some_dir -iname "foo*bar" -execdir pwd \;
... imprimirá os nomes de todos some_dir
os ancestrais (incluindo ele próprio) até os /
quais um arquivo com o padrão seja encontrado.
Ao usar readlink -f
o script acima, siga os links simbólicos no caminho, conforme observado nos comentários. Em realpath -s
vez disso, você pode usar se desejar seguir os caminhos pelo nome ("/ foo / bar" aumentará para "foo" mesmo que "bar" seja um link simbólico) - no entanto, isso requer instalação realpath
que não é instalada por padrão em maioria das plataformas.