Este one-liner parece ser un método bastante robusto:
find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c
Los find . -type f -printf '%f\n'grabados el nombre base de cada archivo normal en el árbol, sin directorios. Eso elimina tener que preocuparse por los directorios que pueden tener .en ellos en su sedexpresión regular.
El sed -r -n 's/.+(\..*)$/\1/p'reemplaza el nombre de archivo entrante con solo su extensión. Por ejemplo, se .somefile.extconvierte .ext. Tenga .+en cuenta la inicial en la expresión regular; Esto hace que cualquier coincidencia necesite al menos un carácter antes de la extensión .. Esto evita que los nombres de archivo .gitignoresean tratados como sin nombre y con la extensión '.gitignore', que es probablemente lo que desea. Si no, reemplace el .+con a .*.
El resto de la línea es de la respuesta aceptada.
Editar : si desea un histograma bien ordenado en formato de gráfico de Pareto , simplemente agregue otro sortal final:
find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c | sort -bn
Salida de muestra de un árbol fuente Linux construido:
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