/ / script per ottenere estensioni di un file - file, bash

script per ottenere estensioni di un file - file, bash

Devo ottenere tutti i tipi di estensione di file in una cartella. Ad esempio, se la directory "s ls fornisce quanto segue:

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

Dovrei ottenere questo eseguendo lo script

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

Ho una conchiglia.

Molte grazie!

risposte:

3 per risposta № 1

prova questo:

ls -1 | sed "s/^[^.]*(..*)$/1/" | sort -u
  • ls elenca i file nella cartella, un file per riga
  • sed estensioni di estratti magici
  • sort -u ordina le estensioni e rimuove i duplicati

sed magic si legge come:

  • s/ / /: sostituisce ciò che sta tra il primo e il secondo / con ciò che sta tra il secondo e il terzo /
  • ^: corrisponde all'inizio della riga
  • [^.]: corrisponde a qualsiasi carattere che non sia un punto
  • *: abbinalo il maggior numero di volte possibile
  • ( e ): ricorda tutto ciò che è abbinato tra queste due parentesi
  • .: abbina un punto
  • .: abbina qualsiasi carattere
  • *: abbinalo il maggior numero di volte possibile
  • $: corrisponde alla fine della riga
  • 1: questo è ciò che è stato abbinato tra parentesi

7 per risposta № 2

Vedere la voce BashFAQ su ParsingLS per una descrizione del perché molte di queste risposte sono cattive.

Il seguente approccio evita questa trappola (e, tra l'altro, ignora completamente i file senza estensione):

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

Tra i vantaggi:

  • Correttezza: ls si comporta in modo incoerente e può portare a risultati inappropriati. Vedi il link in alto.
  • Efficienza: riduce al minimo il numero di sottoprocessi richiamati (solo uno, sort -u, e che potrebbe essere rimosso anche se volessimo utilizzare gli array associativi di Bash 4 per memorizzare i risultati)

Cose che potrebbero ancora essere migliorate:

  • Correttezza: questo scarterà correttamente le nuove righe nei nomi dei file prima della prima . (che alcune altre risposte non avranno) - ma nomi di file con nuove righe dopo la prima . saranno trattati come voci separate da sort. Questo potrebbe essere risolto utilizzando null come delimitatore o con il suddetto approccio di archiviazione di array associativo bash 4.

0 per risposta № 3

Le persone stanno davvero complicando troppo questo, in particolare l'espressione regolare:

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

ls - ottieni tutti i file
grep -o "..*" - -o mostra solo la partita; "..*" corrisponde al primo "." e tutto dopo
uniq - non stampare duplicati ma mantieni lo stesso ordine

puoi anche ordinare se vuoi, ma l'ordinamento non corrisponde all'esempio

Questo è ciò che accade quando lo esegui:

> 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