Este one-liner parece ser um método bastante robusto:
find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c
Ele find . -type f -printf '%f\n'
imprime o nome da base de todos os arquivos regulares na árvore, sem diretórios. Isso elimina a necessidade de se preocupar com diretórios que possam estar presentes .
no seu sed
regex.
O sed -r -n 's/.+(\..*)$/\1/p'
substitui o nome do arquivo recebido por apenas sua extensão. Por exemplo, .somefile.ext
torna-se .ext
. Observe a inicial .+
no regex; isso resulta em qualquer correspondência que precise de pelo menos um caractere antes da extensão .
. Isso evita que nomes de arquivos como .gitignore
sejam tratados como sem nome e com a extensão '.gitignore', que é provavelmente o que você deseja. Caso contrário, substitua o .+
por a .*
.
O restante da linha é da resposta aceita.
Editar : se você deseja um histograma bem classificado no formato de gráfico de Pareto , basta adicionar outro sort
ao final:
find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c | sort -bn
Exemplo de saída de uma árvore de origem Linux integrada:
1 .1992-1997
1 .1994-2004
1 .1995-2002
1 .1996-2002
1 .ac
1 .act2000
1 .AddingFirmware
1 .AdvancedTopics
[...]
1445 .S
2826 .o
2919 .cmd
3531 .txt
19290 .h
23480 .c