Obter todas as extensões e sua respectiva contagem de arquivos em um diretório

14

Obtendo todas as extensões para um diretório: fácil. Obter o arquivo conta para uma extensão específica: fácil.

Mas obter todas as extensões de arquivo e suas respectivas contagens de arquivos está me fazendo alusão.

por exemplo.

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

deve retornar algo como:

.txt 2
.pdf 1
.pov 1

O objetivo deste exercício é descobrir qual extensão de arquivo é popular em um determinado diretório.

desde já, obrigado

desnormalizador
fonte

Respostas:

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

Aqui está a explicação:

find ./ -type f

encontre apenas arquivo, não diretório

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

arquivo de filtro com extensão

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

exclua o caminho e o nome do arquivo, salve apenas a extensão

sort | uniq -c | sort -n

classificar, uniq e classificar

bindbn
fonte
Você poderia fazer o seu regex permitir mais caracteres na extensão e eliminar grepfazendo isso:sed -ne '/\.[^./]*$/s/.*\(\.[^.]*\)$/\1/p'
Em pausa até novo aviso.
Dennis, substituindo o grep e sed com seus retornos sed o seguinte erro: sed: -e expressão # 1, char 30: referência inválida \ 1 no `RHS de comando s
denormalizer
2

Como você está usando Linux (gnu grep), é um bom momento para usar Perl REs (PCRE) -Pe a -oopção grep . Tomando a resposta do @ bindbn como um ótimo candidato:

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