Listar todas las extensiones únicas para archivos contenidos en un directorio

10

Me gustaría ver toda la extensión única de los archivos contenidos en un determinado directorio. ¿Cuál es el comando para hacer eso en bash?

Se podría usar find . -type fpara obtener todos los archivos en el directorio actual, luego quitar la extensión y canalizarla uniq. ¿Cuál es la forma más fácil de quitar la extensión?

dzhelil
fuente

Respuestas:

14

Prueba esto:

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

No genera nada para:

  • Archivos sin extensión
  • Archivos con nombres que terminan en un punto
  • Archivos ocultos

También podría ser útil canalizarlo sort | uniq -c.

Pausado hasta nuevo aviso.
fuente
No funciona con el sed predeterminado en mi Mac. Obtengosed: illegal option -- r
dzhelil
8
@celil: Usar en -Elugar de -ren OS X.
pausa hasta nuevo aviso.
3
find . -type f | sed -E 's/.+[\./]([^/\.]+)/\1/' | sort -u

Funciona en OS X, excepto para archivos sin extensión. Mi carpeta de descargas:

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

Es posible que necesite en su sed -rlugar?


Problema menor: los archivos sin extensiones imprimen su nombre. Los archivos ocultos (como .DS_Store) imprimen su nombre sin guiar ..

Daniel Beck
fuente
Lo recomendaría en sort -ulugar de sort | uniq. Menos bifurcación y uso de recursos.
John T
Gracias @ John. Intenté mantenerme dentro del "marco" de la celda, así que no pensé en ello.
Daniel Beck
No es necesario para escapar de un punto en el interior [].
Pausado hasta nuevo aviso.
3

Aquí hay otra solución que no se confunde con los nombres de archivo que contienen líneas nuevas incrustadas y las utiliza sort -uzpara ordenar correctamente las extensiones de archivo que también pueden tener líneas nuevas incrustadas:

# [^.]: 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
útil
fuente
3

Una forma rápida y fácil de recordar de quitar la extensión es asumir que todos los nombres de archivo tienen el formato "name.ext" y luego usar:

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

esto da una cuenta de cuántas extensiones únicas hay, por ejemplo:

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

mira, por eso me gusta awk:

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