Isso deve fazer o trabalho:
find . -type d | \
awk -F/ '
NF <= old_NF {print prev}
{old_NF=NF; prev=$0}
END {print $0}
'
Exemplo:
find . -type d
.
./backup
./source
./source/siteA
./source/siteA/regionA
./source/siteA/regionA/files
./source/siteA/regionB
./source/siteA/regionB/files
./source/siteA/regionD
./source/siteA/regionD/files
./source/siteA/regionC
./source/siteA/regionC/files
./source/dir with space
./source/siteB
./source/siteB/regionA
./source/siteB/regionA/files
./source/siteB/regionB
./source/siteB/regionB/files
Agora, o comando acima fornece:
./backup
./source/siteA/regionA/files
./source/siteA/regionB/files
./source/siteA/regionD/files
./source/siteA/regionC/files
./source/dir with space
./source/siteB/regionA/files
./source/siteB/regionB/files
Uma breve explicação:
A saída find . -type d
simples já está classificada de acordo com a estrutura de diretórios. O que você quer agora é aquelas linhas (= caminhos) que estão imediatamente antes de uma linha que tenha a mesma profundidade ou menos. E a última linha (sempre).
Isso é o que o comando awk
faz. Divide linhas de entrada no separador de caminho ( -F/
), armazena o número de campos e a linha ( {old_NF=NF; prev=$0}
) e depois compara o número antigo de campos com o atual e imprime a linha armazenada se o número de campos for menor igual ou igual ( NF <= old_NF {print prev}
). E imprime a última linha sempre ( END {print $0}
).