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/targete processará cada um deles, definindo a variáveldircomo 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 comandodupara obter o tamanho do diretório ecutpara 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 -dgarante que só encontramos diretórios, nenhum arquivo e o-mindepthgarante 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 portacque 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.