#!/bin/bash
find "$1" ! -type d |
while read fpath; do
fname="${fpath##*/}"
suffix="${fname##*.}"
if [[ "$suffix" == "$fname" ]]; then
suffix="(none)"
fi
size="$( stat --format '%s' "$fpath" )"
printf '%s\t%d\n' "$suffix" "$size"
done |
awk '{ sz[$1] += $2 }
END { for (s in sz) { printf("%s:\t%d\n", s, sz[s]) } }'
Dado um diretório na linha de comando, o script bash
acima usará stat
1 para obter o tamanho de cada arquivo individual no diretório e, abaixo, em bytes. O while-loop também corta o sufixo de cada arquivo e gera-o juntamente com o tamanho do arquivo (em bytes).
O script awk
2 no final resumirá e imprimirá as informações.
Exemplo, executando em um diretório de um dos meus projetos de trabalho:
$ bash ./script.sh /home/kk/Work/Development/project/src/
c: 4559172
am: 369
h: 151369
o: 4613432
in: 42216
out: 3282712
(none): 2908962
Po: 18414
txt: 7129
A saída pode então ser filtrada e formatada, se necessário.
Modificar isso para fazer porcentagens do tamanho total ou usar file
para obter o tipo de arquivo em vez de confiar no sufixo do nome do arquivo, ou enviar os tamanhos em outra unidade além dos bytes, é deixado para o leitor como no exercício.
1 A chamada stat
aqui é feita sob medida para o GNU stat
do pacote GNU coreutils. O stat
no OpenBSD é totalmente diferente.
2 O script awk
é assumido como sendo executado por uma implementação awk
que sabe sobre matrizes associativas, como o GNU awk
ou mawk
.