Um simples loop de verificação do diretório atual e, se não for encontrado, então remover o último componente funcionaria
#!/bin/bash
wantfile="$1"
dir=$(realpath .)
found=""
while [ -z "$found" -a -n "$dir" ]
do
if [ -e "$dir/$wantfile" ]
then
found="$dir/$wantfile"
fi
dir=${dir%/*}
done
if [ -z "$found" ]
then
echo Can not find: $wantfile
else
echo Found: $found
fi
Por exemplo, se esta for a árvore de diretórios:
$ find /tmp/A
/tmp/A
/tmp/A/good
/tmp/A/good/show
/tmp/A/good/show/this
/tmp/A/B
/tmp/A/B/C
/tmp/A/B/C/thefile
/tmp/A/B/C/D
/tmp/A/B/C/D/E
/tmp/A/B/C/D/E/F
/tmp/A/B/C/D/E/F/srchup
$ pwd
/tmp/A/B/C/D/E/F
$ ./srchup thefile
Found: /tmp/A/B/C/thefile
Podemos ver que a pesquisa subiu na árvore até encontrar o que procurávamos.