Obtenga todas las extensiones y su respectivo conteo de archivos en un directorio

14

Obtener todas las extensiones para un directorio: fácil. Obtener recuentos de archivos para una extensión particular: fácil.

Pero obtener todas las extensiones de archivo y sus respectivos recuentos de archivos me alude.

p.ej.

+ dir
 + abc.txt
 + def.txt
 + abc.pdf
 * def.pov

debería devolver algo como:

.txt 2
.pdf 1
.pov 1

El objetivo de este ejercicio es que quiero averiguar qué extensión de archivo es popular en un determinado directorio.

Gracias por adelantado

desnormalizador
fuente

Respuestas:

47
/var/cache$ sudo find ./ -type f | grep -E ".*\.[a-zA-Z0-9]*$" | sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' | sort | uniq -c | sort -n
      1 .6
      1 .cache
      1 .noconf
      1 .php
      1 .sl
      2 .bin
      2 .el
      2 .tdb
      4 .baseA
      4 .baseB
      4 .dat
      4 .DB
     27 .db
    221 .deb

Aquí está la explicación:

find ./ -type f

buscar solo archivo, no directorio

grep -E ".*\.[a-zA-Z0-9]*$"

archivo de filtro con extensión

sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/'

eliminar ruta y nombre de archivo, guardar solo extensión

sort | uniq -c | sort -n

sort, uniq y sort

bindbn
fuente
Puede hacer que su expresión regular permita más caracteres en la extensión y eliminar grephaciendo esto:sed -ne '/\.[^./]*$/s/.*\(\.[^.]*\)$/\1/p'
pausa hasta nuevo aviso.
Dennis, reemplazando grep y sed con su sed devuelve el siguiente error: sed: -e expresión # 1, char 30: referencia inválida \ 1 en el comando 's' RHS
desnormalizador
2

Como está utilizando Linux (gnu grep), este es un buen momento para usar Perl REs (PCRE) -Py la -oopción de grep . Tomando la respuesta de @ bindbn como un gran candidato:

find . -type f | grep -Po '\.([\w\d])*$' | sort | uniq -c | sort -n
Jim
fuente