A combinação de find
e awk
permite que as médias também sejam calculadas:
find . -type f -printf '%s %h/%fBEGIN { RS="printf "%.2f %d %s: %s\n", SUMSIZES[DIR] / NBFILES[DIR], MAXSIZE[DIR], DIR, BIGGESTFILE[DIR]
" }
{
SIZE=$1
for (i = 1; i <= NF - 1; i++) $i = $(i + 1)
NF = NF - 1
DIR=$0
gsub("/[^/]+$", "", DIR)
FILE=substr($0, length(DIR) + 2)
SUMSIZES[DIR] += SIZE
NBFILES[DIR]++
if (SIZE > MAXSIZE[DIR] || !BIGGESTFILE[DIR]) {
MAXSIZE[DIR] = SIZE
BIGGESTFILE[DIR] = FILE
}
}
END {
for (DIR in SUMSIZES) {
printf "%s: average %f, biggest file %s %d\n", DIR, SUMSIZES[DIR] / NBFILES[DIR], BIGGESTFILE[DIR], MAXSIZE[DIR]
}
}
'|awk 'BEGIN { RS="find . -type f -printf '%s %h/%fBEGIN { RS="printf "%.2f %d %s: %s\n", SUMSIZES[DIR] / NBFILES[DIR], MAXSIZE[DIR], DIR, BIGGESTFILE[DIR]
" }
{
SIZE=$1
for (i = 1; i <= NF - 1; i++) $i = $(i + 1)
NF = NF - 1
DIR=$0
gsub("/[^/]+$", "", DIR)
FILE=substr($0, length(DIR) + 2)
SUMSIZES[DIR] += SIZE
NBFILES[DIR]++
if (SIZE > MAXSIZE[DIR] || !BIGGESTFILE[DIR]) {
MAXSIZE[DIR] = SIZE
BIGGESTFILE[DIR] = FILE
}
}
END {
for (DIR in SUMSIZES) {
printf "%s: average %f, biggest file %s %d\n", DIR, SUMSIZES[DIR] / NBFILES[DIR], BIGGESTFILE[DIR], MAXSIZE[DIR]
}
}
'|awk 'BEGIN { RS="%pre%" } { SIZE=$1; for (i = 1; i <= NF - 1; i++) $i = $(i + 1); NF = NF - 1; DIR=$0; gsub("/[^/]+$", "", DIR); FILE=substr($0, length(DIR) + 2); SUMSIZES[DIR] += SIZE; NBFILES[DIR]++; if (SIZE > MAXSIZE[DIR] || !BIGGESTFILE[DIR]) { MAXSIZE[DIR] = SIZE; BIGGESTFILE[DIR] = FILE } }; END { for (DIR in SUMSIZES) { printf "%s: average %f, biggest file %s %d\n", DIR, SUMSIZES[DIR] / NBFILES[DIR], BIGGESTFILE[DIR], MAXSIZE[DIR] } }'
" } { SIZE=$1; for (i = 1; i <= NF - 1; i++) $i = $(i + 1); NF = NF - 1; DIR=$0; gsub("/[^/]+$", "", DIR); FILE=substr($0, length(DIR) + 2); SUMSIZES[DIR] += SIZE; NBFILES[DIR]++; if (SIZE > MAXSIZE[DIR] || !BIGGESTFILE[DIR]) { MAXSIZE[DIR] = SIZE; BIGGESTFILE[DIR] = FILE } }; END { for (DIR in SUMSIZES) { printf "%s: average %f, biggest file %s %d\n", DIR, SUMSIZES[DIR] / NBFILES[DIR], BIGGESTFILE[DIR], MAXSIZE[DIR] } }'
Apresentado de uma maneira mais legível, o script AWK é
%pre%Isso espera registros de entrada separados por nulo (eu roubei isso da resposta do muru ); para cada registro de entrada,
- armazena o tamanho (para uso posterior),
- remove tudo antes do primeiro caractere no caminho (para que possamos, pelo menos, manipular nomes de arquivos com espaços corretamente),
- extrai o diretório
- extrai o nome do arquivo,
- adiciona o tamanho que armazenamos anteriormente à soma dos tamanhos no diretório
- incrementa o número de arquivos no diretório (para que possamos calcular a média),
- se o tamanho for maior que o tamanho máximo armazenado para o diretório ou se ainda não tivermos visto um arquivo no diretório, atualizará as informações do arquivo maior.
Depois de tudo isso, o script faz um loop sobre as chaves em SUMSIZES
e gera o diretório, o tamanho médio, o nome e o tamanho do arquivo maior.
Você pode canalizar a saída em sort
para classificar por nome de diretório. Se você deseja formatar adicionalmente os tamanhos de forma amigável, você pode alterar a linha printf
para
e, em seguida, canaliza a saída para numfmt --field=1,2 --to=iec
. Você ainda pode classificar o resultado por nome de diretório, você só precisa classificar começando com o terceiro campo: sort -k3
.