Pagina 1 di 1

[BASH] Eliminare solo certi files [RISOLTO]

Inviato: mer 21 dic 2011, 11:22
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?

Re: [BASH] Eliminare solo certi files

Inviato: mer 21 dic 2011, 11:52
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

Re: [BASH] Eliminare solo certi files

Inviato: mer 21 dic 2011, 13:07
da Blallo
Esattamente quel che mi serviva! Grazie masa :)

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

Inviato: mer 21 dic 2011, 20:47
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