Script para mostrar o número de arquivos (por tipo de arquivo) em um diretório?

1

Eu quero mostrar esse tipo de estatística sobre um diretório específico:

$ myscript.sh
.c 34265 files
.h 17866 files
.cbl 1804 files
.pco 389 files
[...]

Existe uma ferramenta que pode fazer isso?

Aqui está minha tentativa:

find . -name "*.*" | sed -e "s/.*\.//g" | sort -u

E então eu poderia digitar para cada tipo find . -name "*.pc" | wc -l , mas é incômodo, então escrevi:

find . -name "*.*" | sed -e "s/.*\.//g" | sort -u |\
    xargs find . -name "*.{}" | wc -l

Infelizmente eu devo estar perdendo alguma coisa porque diz:

find: paths must precede expression: as

("as" é a primeira extensão)
Alguma ideia do que está errado?
Já existe uma ferramenta que faz o que eu quero (uma linha de arquivo de contagem de ferramentas seria OK também).

    
por Nicolas Raoul 17.02.2012 / 07:26

3 respostas

1

Isso pode ser feito com gawk : canalize sua lista de nomes de arquivos através do seguinte (deixado como um exercício / testei com ls -1 , mas não explico ls (tm)):

gawk -F. '1 {exts[$NF]++} END {for (ext in exts){printf "%s: %s files\n", ext, exts[ext]}}'

Isso pressupõe que tudo o que é seguido por um período não faz parte da extensão, portanto, nomes de arquivos sem contagem de período como extensão total. (Eu acho que deve ser suficiente para alterar 1 { para (NF>1) { para obter apenas arquivos com extensões adequadas.

    
por 17.02.2012 / 07:48
1

O pipeline a seguir imprime cada linha distinta na entrada precedida por sua contagem de repetições, classificada por contagem decrescente decrescente:

sort | uniq -c | sort -rn

Assim:

find . -type f -name '?*.*' | sed 's/.*\.//' | sort | uniq -c | sort -rn
    
por 17.02.2012 / 08:59
0
ls -1 | awk -F. '{if(NF>1)arr[$NF]++;else blnk++}END{for(i in arr)printf(".%s %s file(s)\n",i,arr[i]);printf("<No Extension> %s file(s)\n",blnk)}'
    
por 17.02.2012 / 08:18