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?

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.


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 ..


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

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  

1

mira, por eso me gusta awk:

find . -type f | awk -F "." '{ print $(NF) }' | sort -u
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.