A seguinte função de shell usa um nome de caminho e determina o maior número que realmente existe. Ele faz isso removendo o último elemento de caminho do caminho até que o caminho esteja completamente vazio ou corresponda a um arquivo (ou diretório, ou qualquer coisa) que realmente exista.
fixpath () (
pathname="$1"
while [ -n "$pathname" ] && [ ! -e "$pathname" ]; do
pathname=${pathname%/*}
case "$pathname" in
*/*) continue ;;
*) [ -e "$pathname" ] || pathname=''
break
esac
done
printf 'Longest existing path in "%s" is "%s"\n' "$1" "$pathname"
)
A instrução case
é necessária para finalizar o loop, no caso em que $pathname
não contenha /
(o que significa que não seria modificado pela substituição da variável). Isso evita um loop infinito em algumas circunstâncias.
Teste:
$ fixpath /home/kk/blaha/123
Longest existing path in "/home/kk/blaha/123" is "/home/kk"
$ fixpath "$HOME/.profile"
Longest existing path in "/home/kk/.profile" is "/home/kk/.profile"
$ fixpath "n"
Longest existing path in "n" is ""