Em uma máquina Linux, eu gostaria de percorrer uma hierarquia de pastas e obter uma lista de todas as extensões de arquivo distintas nela.
Qual seria a melhor maneira de conseguir isso com um shell?
linux
grep
filesystems
file-extension
GloryFish
fonte
fonte
.svn
), usefind . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
sourcegit ls-tree -r HEAD --name-only
vez defind
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
Não é necessário o pipe
sort
, o awk pode fazer tudo:fonte
alias
comando, mas o próprio comando já usa aspas no comando find. Para consertar isso, eu usariabash
a sintaxe literal de strings da seguinte maneira:alias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
maindir/test.dir/myfile
-printf "%f\n"
ao final do comando 'find' e execute novamente o seu teste.Versão recursiva:
Se você deseja totais (quantas vezes a extensão foi vista):
Não recursivo (pasta única):
Baseei isso nesta postagem do fórum , o crédito deve ir para lá.
fonte
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
Powershell:
Obrigado a http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html
fonte
.
(por exemplojquery-1.3.4
, aparecerão como.4
na saída). Mude paradir -file -recurse | select-object extension -unique
para obter apenas extensões de arquivo.Minha alternativa compatível com POSIX: awk-less, sed-less, Perl-less e Python-less:
O truque é que ele inverte a linha e corta a extensão no início.
Também converte as extensões em minúsculas.
Exemplo de saída:
fonte
uniq
não tem a bandeira completa--count
, mas-c
funciona muito bemEncontre tudo com um ponto e mostre apenas o sufixo.
se você souber que todo sufixo tem 3 caracteres,
ou com sed mostra todos os sufixos com um a quatro caracteres. Altere {1,4} para o intervalo de caracteres que você espera no sufixo.
fonte
-name "."
coisa, porque isso é o que já estáAdicionando minha própria variação à mistura. Eu acho que é o mais simples do lote e pode ser útil quando a eficiência não é uma grande preocupação.
fonte
$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
No Python, use geradores para diretórios muito grandes, incluindo extensões em branco, e obtenha o número de vezes que cada extensão aparece:
fonte
Eu tentei um monte de respostas aqui, mesmo a "melhor" resposta. Todos ficaram aquém do que eu estava procurando especificamente. Portanto, além das últimas 12 horas sentado no código regex para vários programas e lendo e testando essas respostas, é isso que eu criei que funciona EXATAMENTE como eu quero.
Se você precisar de uma contagem das extensões de arquivo, use o código abaixo
Embora esses métodos levem algum tempo para serem concluídos e provavelmente não sejam as melhores maneiras de solucionar o problema, eles funcionam.
Atualização: as extensões de arquivo longas por @ alpha_989 causarão um problema. Isso se deve ao regex original "[[: alpha:]] {3,6}". Atualizei a resposta para incluir a regex "[[: alpha:]] {2,16}". No entanto, qualquer pessoa que use esse código deve estar ciente de que esses números são o mínimo e o máximo de quanto tempo a extensão é permitida para a saída final. Qualquer coisa fora desse intervalo será dividida em várias linhas na saída.
Nota: A postagem original leu "- Greps para extensões de arquivo entre 3 e 6 caracteres (basta ajustar os números se eles não atenderem às suas necessidades). Isso ajuda a evitar arquivos em cache e arquivos do sistema (o bit do arquivo do sistema é procurar prisão). "
Idéia: pode ser usada para encontrar extensões de arquivos com um comprimento específico via:
Onde 4 é o comprimento das extensões de arquivo a incluir e, em seguida, encontre também as extensões além desse comprimento.
fonte
Como já existe outra solução que usa Perl:
Se você possui o Python instalado, também pode fazer (a partir do shell):
fonte
Até agora, nenhuma das respostas lida com nomes de arquivos com novas linhas corretamente (exceto os de ChristopheD, que chegaram quando eu estava digitando isso). O seguinte não é uma linha de shell, mas funciona e é razoavelmente rápido.
fonte
Eu não acho que este foi mencionado ainda:
fonte
Eu acho que a maneira mais simples e direta é
É modificado na 3ª via de ChristopheD.
fonte
você também pode fazer isso
fonte
Achei simples e rápido ...
fonte
A resposta aceita usa REGEX e você não pode criar um comando alternativo com REGEX, você deve colocá-lo em um script de shell, estou usando o Amazon Linux 2 e fiz o seguinte:
Coloquei o código de resposta aceito em um arquivo usando:
sudo vim find.sh
adicione este código:
salve o arquivo digitando:
:wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
fonte