Tente isto:
find . -type f | sed -rn 's|.*/[^/]+\.([^/.]+)$||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
.
Eu 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 f
para obter todos os arquivos no diretório atual, depois remover a extensão e canalizá-la para uniq
. Qual é a maneira mais fácil de despir a extensão?
Uma forma rápida e fácil de memorizar a extensão é fazer com que todos os nomes de arquivos tenham o formato "name.ext" e depois usar:
ls -1 | cut -d"." -f2- | sort | uniq -c
isso fornece uma contagem de quantas extensões exclusivas existem, por exemplo:
1 sh
3 txt
4 txt.Z
17 dat
72 dat.gz
Aqui está outra solução que não se confunde com nomes de arquivos que contêm novas linhas incorporadas e usa sort -uz
para ordenar corretamente extensões de arquivos que também podem ter novas linhas incorporadas:
# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
printf "%s# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
printf "%s%pre%0" "${@##*.}" # get the extensions and nul-terminate each of them
' argv0 '{}' + |
sort -uz |
tr '%pre%' '\n' |
nl
0" "${@##*.}" # get the extensions and nul-terminate each of them
' argv0 '{}' + |
sort -uz |
tr '%pre%' '\n' |
nl
find . -type f | sed -E 's/.+[\./]([^/\.]+)//' | sort -u
Funciona no OS X, exceto 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 de sed -r
?
Problema secundário: os arquivos sem extensões imprimem seu nome. Arquivos ocultos (como .DS_Store
) imprimem seu nome sem gerar .
.
veja, é por isso que eu gosto do awk:
find . -type f | awk -F "." '{ print $(NF) }' | sort -u
Tags unix