/ / script para obtener extensiones de un archivo - archivo, bash

Script para obtener extensiones de un archivo - archivo, bash

Necesito obtener todos los tipos de extensión de archivo en una carpeta. Por ejemplo, si el directorio "s ls da lo siguiente:

a.t
b.t.pg
c.bin
d.bin
e.old
f.txt
g.txt

Debería obtener esto ejecutando el script

.t
.t.pg
.bin
.old
.txt

Tengo una concha de bash.

¡Muchas gracias!

Respuestas

3 para la respuesta № 1

prueba esto:

ls -1 | sed "s/^[^.]*(..*)$/1/" | sort -u
  • ls lista los archivos en su carpeta, un archivo por línea
  • sed extensiones de extractos magicos
  • sort -u ordena las extensiones y elimina duplicados

La magia sed se lee como:

  • s/ / /: sustituye lo que esté entre el primer y el segundo / por lo que esté entre el segundo y el tercero /
  • ^: emparejar principio de linea
  • [^.]: coincide con cualquier carácter que no sea un punto
  • *: empareja tantas veces como sea posible
  • ( y ): recuerda lo que coincida entre estos dos paréntesis
  • .: emparejar un punto
  • .: coincide con cualquier personaje
  • *: empareja tantas veces como sea posible
  • $: partido final de línea
  • 1: esto es lo que se ha emparejado entre paréntesis

7 para la respuesta № 2

Ver la entrada BashFAQ en ParsingLS para una descripción de por qué muchas de estas respuestas son malas.

El siguiente enfoque evita este escollo (y, por cierto, ignora completamente los archivos sin extensión):

shopt -s nullglob
for f in *.*; do
printf "%sn" ".${f#*.}"
done | sort -u

Entre las ventajas:

  • Exactitud: ls se comporta de manera inconsistente y puede resultar en resultados inapropiados. Vea el enlace en la parte superior.
  • Eficiencia: minimiza el número de subprocesos invocados (solo uno, sort -u, y eso podría ser eliminado también si quisiéramos usar matrices asociativas de Bash 4 para almacenar resultados)

Cosas que aún se podrían mejorar:

  • Corrección: esto descartará correctamente las nuevas líneas en los nombres de archivo antes de la primera . (que algunas otras respuestas ganaron "t) - pero los nombres de archivo con nuevas líneas después de la primera . serán tratados como entradas separadas por sort. Esto podría solucionarse mediante el uso de valores nulos como delimitador o mediante el método de almacenamiento asociativo de matriz bash 4 mencionado anteriormente.

0 para la respuesta № 3

La gente está complicando demasiado esto, especialmente la expresión regular:

ls | grep -o "..*" | uniq

ls - obtener todos los archivos
grep -o "..*" - -o solo mostrar el partido; "..*" partido en el primer "." y todo despues
uniq - No imprima duplicados pero mantenga el mismo orden

también puede ordenar si lo desea, pero la clasificación no coincide con el ejemplo

Esto es lo que pasa cuando lo ejecutas:

> ls -1
a.t
a.t.pg
c.bin
d.bin
e.old
f.txt
g.txt

> ls | grep -o "..*" | uniq
.t
.t.pg
.bin
.old
.txt