Se eu entendi corretamente, isso vai te dar o que você quer:
find /path/to/target -type d | while IFS= read -r dir; do
echo -ne "$dir\tsize: $(du -sh "$dir" | cut -f 1)"
echo -ne "\tsubdirs: $(find "$dir" -mindepth 1 -type d | wc -l)"
echo -e "\tfiles: $(find "$dir" -type f | wc -l )";
done | tac
Se você executar isso em /boot
, por exemplo, você terá uma saída assim:
/boot/burg/themes/sora_extended size: 8.0K subdirs: 0 files: 1
/boot/burg/themes/radiance/images size: 196K subdirs: 0 files: 48
/boot/burg/themes/radiance size: 772K subdirs: 1 files: 53
/boot/burg/themes/winter size: 808K subdirs: 0 files: 35
/boot/burg/themes/icons size: 712K subdirs: 0 files: 76
/boot/burg/themes size: 8.9M subdirs: 26 files: 440
/boot/burg/fonts size: 7.1M subdirs: 0 files: 74
/boot/burg size: 20M subdirs: 29 files: 733
/boot/grub/locale size: 652K subdirs: 0 files: 17
/boot/grub size: 4.6M subdirs: 1 files: 224
/boot/extlinux/themes/debian-wheezy/extlinux size: 732K subdirs: 0 files: 11
/boot/extlinux/themes/debian-wheezy size: 1.5M subdirs: 1 files: 22
/boot/extlinux/themes size: 1.5M subdirs: 2 files: 22
/boot/extlinux size: 1.6M subdirs: 3 files: 28
/boot/ size: 122M subdirs: 36 files: 1004
Para ter acesso fácil a este comando, você pode transformá-lo em uma função. Adicione estas linhas ao arquivo de inicialização do seu shell ( ~/.bashrc
for bash):
dirsize(){
find "$1" -type d | while IFS= read -r dir; do
echo -ne "$dir\tsize: $(du -sh "$dir"| cut -f 1)"
echo -ne "\tsubdirs: $(find "$dir" -mindepth 1 -type d | wc -l)"
echo -e "\tfiles: $(find "$dir" -maxdepth 1 -type f | wc -l )";
done | tac
}
Agora você pode executá-lo como dirsize /path/
.
Explicação
A função acima tem 5 partes principais:
-
find /path/to/target -type d | while IFS= read -r dir; do ... ; done
: encontrará todos os diretórios em/path/to/target
e processará cada um deles, definindo a variáveldir
como seu nome. OIFS=
garante que isso não será interrompido em diretórios com espaços em seus nomes. -
echo -ne "$dir\tsize: $(du -sh "$dir" | cut -f 1)"
: usa o comandodu
para obter o tamanho do diretório ecut
para imprimir apenas o primeiro campo dedu
. -
echo -ne "\tsubdirs: $(find "$dir" -mindepth 1 -type d | wc -l)"
: este comando find procura por subdiretórios de$dir
. Otype -d
garante que só encontramos diretórios, nenhum arquivo e o-mindepth
garante que não contemos o diretório atual,.
. -
echo -e "\tfiles: $(find "$dir" -maxdepth 1 -type f | wc -l)";
: Este procura por arquivos (-type f
) diretamente (-maxdepth 1
) sob$dir
. Não contará arquivos que estão em subdiretórios de$d
. -
| tac
: Finalmente, a coisa toda é passada portac
que simplesmente reverte a ordem em que as linhas são impressas. Isso significa que o tamanho total do diretório de destino será mostrado como a última linha. Se não for o que você deseja, basta excluir| tac
.