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
Gary R. Van Sickle
fuente
*.php?blah=blah&foo=bar
con varios argumentos, por lo que los cuenta a todos como únicos. ¿Cómo puedo modificarlo para buscarlo*.php*
?sed 's/^.*\(\.[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]\).*$/\1/'
find -name '.*' -prune -o -type f -print
evalúa como: si la entrada del directorio coincide.*
, podarla; de lo contrario, si es un archivo, imprimirlo. Como.*
también coincide.
, es decir, el CWD, todo se poda, es decir, find ni siquiera desciende al primer directorio. Tal vez, las versiones de 2 años de edad sefind
comportaron de manera diferente, o era solo un descuido de mí, en aquel entonces. De todos modos,find -name '.*' -not -name . -prune -o -type f -print
arregla esto.