Eu tentaria algo como:
find {root_of_folders} -type d | sort | grep -A 1 "$(basename "$PWD")\$" | tail -1
Em outras palavras: lits todos os dirs e encontrar o que vem depois do atual na lista. Com o final \$
itera seus subdiretórios, sem ele vai para o próximo diretório no mesmo nível.
Para o diretório anterior, você usa -B 1
e head -1
.
Editar: algumas melhorias:
-
o código acima tem problemas se os nomes dos arquivos contiverem coisas que podem ser interpretadas como sintaxe regexp (caracteres entre parênteses, em particular), então é melhor usar
grep -F
(mas você não pode mais usar o\$
) -
Para evitar ocorrências falsas se um nome de diretório for uma parte não inicial de outro, prefixe com / para forçar a correspondência a ocorrer desde o início.
Então, a forma melhorada é:
find {root_of_folders} -type d | sort | grep -A 1 -F "/$(basename "$PWD")" | tail -1