Hice un raspado de sitio web para un proyecto de conversión. Me gustaría hacer algunas estadísticas sobre los tipos de archivos allí, por ejemplo, 400 .html
archivos, 100 .gif
, etc. ¿Cuál es una manera fácil de hacer esto? Tiene que ser recursivo.
Editar: con el script que publicó maxschelpzig, tengo algunos problemas debido a la arquitectura del sitio que he eliminado. Algunos de los archivos son del nombre *.php?blah=blah&foo=bar
con varios argumentos, por lo que los cuenta a todos como únicos. Por lo tanto, la solución debe considerarse *.php*
del mismo tipo, por así decirlo.
*.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.Con zsh:
El patrón
**/?*.*
coincide con todos los archivos que tienen una extensión, en el directorio actual y sus subdirectorios de forma recursiva. El calificador globalD
permitezsh
recorrer incluso directorios ocultos y considerar archivos ocultos,.
selecciona solo archivos normales. El modificador de historial conserva solo la extensión del archivo.print -rl
imprime una coincidencia por línea.uniq -c
cuenta elementos idénticos consecutivos (el resultado global ya está ordenado). La última llamada parasort
ordenar las extensiones por conteo de uso.fuente
Este one-liner parece ser un método bastante robusto:
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 sused
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:Salida de muestra de un árbol fuente Linux construido:
fuente
Puse un script bash en mi
~/bin
carpeta llamadaexhist
con este contenido:En cualquier directorio en el que me encuentre, simplemente escribo 'exh', la pestaña lo completa automáticamente y veo algo como esto:
PS Recortar la parte después del signo de interrogación debería ser simple de hacer con otro comando sed probablemente después del último (no lo he probado):
sed 's/\?.*//'
fuente