Você não precisa grep para o código de cor, a opção -d é list directories only .
Isso parece fazer o que você quer:
$ tree --du -d -shaC | grep -Ev '( *[^ ]* ){2}\['
.
├── [ 18] dir1
├── [ 30] dir2
├── [ 205] junk
│ ├── [ 18] dir1
│ ├── [ 30] dir2
│ └── [ 76] dir3
├── [ 119] merge
└── [ 20] stuff
4.4K used in 10 directories
O comando grep remove todas as linhas que têm (um ou mais espaços seguidos por um não espaço seguido por um espaço) duas vezes, seguidas por um [ .
Se você quiser uma profundidade de 1, altere a contagem limite dentro das chaves {} para {1} em vez de {2} . mesmo se você quiser uma profundidade de 3, mude para {3} .
Você pode transformar isso em uma função shell, assim:
mytreedu() {
local depth=''
while getopts "L:" opt ; do
case "$opt" in
L) depth="$OPTARG" ;;
esac
done
shift "$((OPTIND-1))"
if [ -z "$depth" ] ; then
tree --du -d -shaC "$@"
else
local PATTERN='( *[^ ]* ){'"$depth"'}\['
tree --du -d -shaC "$@" | grep -Ev "$PATTERN"
fi
}
Isso usa getopts para "roubar" qualquer opção -L e seu argumento da linha de comando tree , se houver. Se não houver uma opção -L n na linha de comando, isso também funciona.
Todas as outras opções e argumentos são passados para o comando tree .
A linha local PATTERN=... não é realmente necessária. Eu só fiz isso para ter certeza de que caberia em uma linha e não em quebra de linha aqui em U&L . A expressão regular poderia e provavelmente deveria ir diretamente na linha tree | grep ... .
Execute assim:
mytreedu
ou
mytreedu -L 2 /path/to/dir/