Uma versão ainda mais geral que permite usar as opções find
:
#!/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 \;
... imprime os nomes de todos os antepassados de some_dir
(incluindo ele próprio) até /
no qual um arquivo com o padrão é encontrado.
Ao usar readlink -f
, o script acima seguirá os links simbólicos na subida, conforme observado nos comentários. Você pode usar realpath -s
, se você quiser seguir os caminhos pelo nome ("/ foo / bar" irá para "foo" mesmo que "bar" seja um link simbólico) - no entanto, isso requer a instalação de realpath
, que não é não é instalado por padrão na maioria das plataformas.