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 sed
expresión regular.
El sed -r -n 's/.+(\..*)$/\1/p'
reemplaza el nombre de archivo entrante con solo su extensión. Por ejemplo, se .somefile.ext
convierte .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 .gitignore
sean 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 sort
al 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