Criei um site para um projeto de conversão. Eu gostaria de fazer algumas estatísticas sobre os tipos de arquivos existentes - por exemplo, 400 .html
arquivos, 100 .gif
, etc. Qual é a maneira mais fácil de fazer isso? Tem que ser recursivo.
Edit: Com o script que maxschelpzig postou, estou tendo alguns problemas devido à arquitetura do site que raspei. Alguns dos arquivos têm o nome *.php?blah=blah&foo=bar
com vários argumentos, portanto, todos são considerados únicos. Portanto, a solução precisa *.php*
ser do mesmo tipo, por assim dizer.
*.php?blah=blah&foo=bar
com vários argumentos, portanto, todos são considerados únicos. Como posso modificá-lo para procurar*.php*
?sed 's/^.*\(\.[a-zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]\).*$/\1/'
find -name '.*' -prune -o -type f -print
avalia como: se a entrada do diretório corresponder.*
e a remover, caso contrário, se for um arquivo, imprima-a. Como.*
também corresponde.
, ou seja, o CWD, tudo é removido, ou seja, o find nem sequer desce para o primeiro diretório. Talvez as versões de 2 anos defind
comportamento se comportassem de maneira diferente - ou era apenas uma supervisão minha na época. De qualquer forma,find -name '.*' -not -name . -prune -o -type f -print
isso corrige.Com zsh:
O padrão
**/?*.*
corresponde a todos os arquivos que possuem uma extensão, no diretório atual e em seus subdiretórios recursivamente. O qualificador globD
permitezsh
percorrer até diretórios ocultos e considerar arquivos ocultos,.
seleciona apenas arquivos regulares. O modificador de histórico mantém apenas a extensão do arquivo.print -rl
imprime uma correspondência por linha.uniq -c
conta itens idênticos consecutivos (o resultado global já está classificado). A chamada final parasort
classificar os ramais por contagem de uso.fonte
Este one-liner parece ser um método bastante robusto:
Ele
find . -type f -printf '%f\n'
imprime o nome da base de todos os arquivos regulares na árvore, sem diretórios. Isso elimina a necessidade de se preocupar com diretórios que possam estar presentes.
no seused
regex.O
sed -r -n 's/.+(\..*)$/\1/p'
substitui o nome do arquivo recebido por apenas sua extensão. Por exemplo,.somefile.ext
torna-se.ext
. Observe a inicial.+
no regex; isso resulta em qualquer correspondência que precise de pelo menos um caractere antes da extensão.
. Isso evita que nomes de arquivos como.gitignore
sejam tratados como sem nome e com a extensão '.gitignore', que é provavelmente o que você deseja. Caso contrário, substitua o.+
por a.*
.O restante da linha é da resposta aceita.
Editar : se você deseja um histograma bem classificado no formato de gráfico de Pareto , basta adicionar outro
sort
ao final:Exemplo de saída de uma árvore de origem Linux integrada:
fonte
Coloquei um script bash na minha
~/bin
pasta chamadaexhist
com este conteúdo:Qualquer que seja o diretório em que eu esteja, basta digitar 'exh', a guia o preenche automaticamente e vejo algo assim:
PS: Aparar a peça após o ponto de interrogação deve ser simples com outro comando sed, provavelmente após o último (não tentei):
sed 's/\?.*//'
fonte