Eu tenho um sistema de arquivos que possui alguns milhões de arquivos e gostaria de ver uma distribuição de tamanhos de arquivos recursivamente em um diretório específico. Eu sinto que isso é totalmente factível com algum bash / awk fu, mas poderia usar uma mão. Basicamente, eu gostaria de algo como o seguinte:
1KB: 4123
2KB: 1920
4KB: 112
...
4MB: 238
8MB: 328
16MB: 29138
Count: 320403345
Eu sinto que isso não deveria ser tão ruim, dado um loop e alguns arquivos de log2 condicionais foo, mas não consigo chegar lá.
Pergunta relacionada: Como posso encontrar arquivos maiores / menores que x bytes? .
linux
command-line
bash
unix
notpeter
fonte
fonte
ls
para afind
. Estou colocando de volta do jeito que estava.xargs
é significativamente mais rápido do que-exec
, então eu usei esse método.Com base na resposta de garyjohn, aqui está uma linha, que também formata a saída para legível por humanos:
Aqui está a versão expandida:
Na primeira
awk
, defini um tamanho mínimo de arquivo para coletar todos os arquivos com menos de 1kb em um único local. No segundoawk
, a funçãohuman(x)
é definida para criar um tamanho legível por humanos. Esta parte é baseada em uma das respostas aqui: /unix/44040/a-standard-tool-to-convert-a-byte-count-into-human-kib-mib-etc -like-du-ls1A saída de amostra é semelhante a:
fonte
Tente o seguinte:
RESULTADO :
EXPLICAÇÃO:
find . -type f -exec ls -lh {} \;
: simples o suficiente, encontre arquivos no diretório atual e executels -lh
-osmatch($5,/([0-9.]+)([A-Z]+)/,k);
: isso extrairá o tamanho do arquivo e salvará cada correspondência na matrizk
.if(!k[2]){print "1K"}
: sek[2]
for indefinido, o tamanho do arquivo é <1K. Como estou imaginando que você não se importa com tamanhos tão pequenos, o script será impresso1K
para todos os arquivos cujo tamanho é <= 1K.else{printf "%.0f%s\n",k[1],k[2]}
: se o arquivo for maior que 1K, arredonde o tamanho do arquivo para o número inteiro mais próximo e imprima junto com seu modificador (K, M ou G).sort | uniq -c
: conte as ocorrências de cada linha (tamanho do arquivo) impressa.sort -hk 2
: classifique de acordo com o segundo campo no formato legível por humanos. Dessa forma,7G
é classificado depois8M
.fonte