Listar todas as extensões exclusivas para arquivos contidos em um diretório

10

Gostaria de ver toda a extensão exclusiva de arquivos contidos em um determinado diretório. Qual é o comando para fazer isso no bash?

Pode-se usar find . -type fpara obter todos os arquivos no diretório atual, remover a extensão e canalizá-la uniq. Qual é a maneira mais fácil de remover a extensão?

dzhelil
fonte

Respostas:

14

Tente o seguinte:

find . -type f | sed -rn 's|.*/[^/]+\.([^/.]+)$|\1|p' | sort -u

Não produz nada para:

  • Arquivos sem extensão
  • Arquivos com nomes que terminam em um ponto
  • Arquivos ocultos

Também pode ser útil canalizá-lo para sort | uniq -c.

Pausado até novo aviso.
fonte
Não funciona com o sed padrão no meu Mac. Eu recebosed: illegal option -- r
dzhelil 12/01
8
@celil: Use em -Evez de -rno OS X.
Pausado até novo aviso.
3
find . -type f | sed -E 's/.+[\./]([^/\.]+)/\1/' | sort -u

Funciona no OS X, exceto para arquivos sem extensão. Minha pasta de downloads:

DS_Store
dmg
exe
localized
msi
nib
plist
pmproj
rar
tgz
txt
webloc
zip

Você pode precisar sed -r?


Problema secundário: arquivos sem extensões imprimem seus nomes. Arquivos ocultos (como .DS_Store) imprimem seus nomes sem avanço ..

Daniel Beck
fonte
Eu recomendaria em sort -uvez de sort | uniq. Menos bifurcação e uso de recursos.
John T
Obrigado @John. Tentei me manter dentro da "estrutura" de celil, então não pensei nisso.
Daniel Beck
Não é necessário escapar de um ponto dentro [].
Pausado até novo aviso.
3

Aqui está outra solução que não se confunde com nomes de arquivos que contêm novas linhas incorporadas e usa sort -uzpara classificar corretamente as extensões de arquivo que também podem ter novas linhas incorporadas:

# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
   printf "%s\000" "${@##*.}" # get the extensions and nul-terminate each of them
' argv0 '{}' + |
sort -uz | 
tr '\0' '\n' | 
nl
enérgico
fonte
3

Uma maneira rápida e fácil de lembrar de remover a extensão é assumir que todos os nomes de arquivos têm o formato "name.ext" e use:

 ls -1 | cut -d"." -f2- | sort | uniq -c

isso fornece uma contagem de quantas extensões únicas existem, por exemplo:

   1 sh  
   3 txt  
   4 txt.Z  
  17 dat  
  72 dat.gz  
jcloos
fonte
1

veja, é por isso que eu gosto do awk:

find . -type f | awk -F "." '{ print $(NF) }' | sort -u
banqueiro
fonte