[BASH] Eliminare solo certi files [RISOLTO]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

[BASH] Eliminare solo certi files [RISOLTO]

Messaggio da Blallo »

Ho un elenco di files di questo tipo:

Codice: Seleziona tutto

a-0.1.tar.bz2
a-0.1.tar.gz
a-0.2.tar.bz2
a-0.2.tar.gz
a-0.3.tar.bz2
a-0.3.tar.gz
b-0.1.tar.bz2
b-0.1.tar.gz
b-0.2.tar.bz2
b-0.2.tar.gz
.. e via discorrendo.
Mi occorrerebbe uno script che elimini tutti gli archivi con versione inferiore alla maggiore e poi a sua volta mi tenga il tar.bz2
Es: dovrebbero rimanermi, dalla lista sopra, solo

Codice: Seleziona tutto

a-0.3.tar.bz2
b-0.2.tar.bz2
Solo che non ho la minima idea per cominciare nemmeno!
Qualcun ha idee?
Ultima modifica di Blallo il mer 21 dic 2011, 13:07, modificato 1 volta in totale.

Avatar utente
masalapianta
Iper Master
Iper Master
Messaggi: 2775
Iscritto il: lun 25 lug 2005, 0:00
Nome Cognome: famoso porco
Kernel: uname -r
Desktop: awesome
Distribuzione: Debian
Località: Roma
Contatta:

Re: [BASH] Eliminare solo certi files

Messaggio da masalapianta »

rm *gz; for i in `ls|awk -F '-' '{print $1}'|sort|uniq`; do for j in `ls $i-*|awk -F '-' '{print $2}'|awk -F '.tar.bz2' '{print $1}'|sort -r -n|uniq|tail -n +2`; do rm $i-$j.tar.bz2;done;done

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: [BASH] Eliminare solo certi files

Messaggio da Blallo »

Esattamente quel che mi serviva! Grazie masa :)

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Re: [BASH] Eliminare solo certi files [RISOLTO]

Messaggio da targzeta »

Un altra soluzione "più rapida" potrebbe essere questa:

Codice: Seleziona tutto

rm *gz;old_file=""; for file in *; do  [[ ${file%%-*} == ${old_file%%-*} ]] && rm $old_file; old_file=${file}; done
In pratica controlla due file successivi e se la parte iniziale (la parte prima del primo '-') è uguale per entrambi, allora cancella il primo dei due file. Si bassa sul fatto che i file sono già ordinati lessicograficamente.

Nota0: come ho scritto qualche giorno fa in un altro thread, il 'for in *' dovrebbe ritornare i file ordinati (anche se non l'ho mai trovato scritto da nessuna parte), comunque, per stare più tranquillo potresti usare:

Codice: Seleziona tutto

for file in $(ls *)
Nota1: se controlli bene l'algoritmo noterai che l'ultimo file ".bz2" non verrà mai cancellato, ma dovrebbe essere il comportamento voluto.

Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Rispondi