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 № 1prova questo:
ls -1 | sed "s/^[^.]*(..*)$/1/" | sort -u
ls
elenca i file nella cartella, un file per rigased
estensioni di estratti magicisort -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 riga1
: 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 dasort
. 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