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/