Come rimuovo più file con un prefisso e un suffisso comuni?


21

Ho molti file chiamati

sequence_1_0001.jpg  
sequence_1_0002.jpg  
sequence_1_0003.jpg  
...

e file denominati

sequence_1_0001.hmf  
sequence_1_0002.hmf  
sequence_1_0003.hmf  
...

e file denominati

sequence_2_0001.jpg  
sequence_2_0002.jpg  
sequence_2_0003.jpg  
...

e

sequence_2_0001.hmf  
sequence_2_0002.hmf  
sequence_2_0003.hmf  
...

Voglio solo rimuovere i file che iniziano con 'sequence_1' e terminano con '.hmf', ma non voglio rimuoverli uno per uno, poiché ci sono migliaia di file. Come posso specificare al comando rm che desidero rimuovere tutto ciò che inizia con il prefisso "sequenza_1" e termina con ".hmf"?

Attualmente sto lavorando con un sistema RedHat Linux, ma mi piacerebbe sapere come farlo anche su altre distribuzioni.

Risposte:


28
rm sequence_1*.hmf

rimuove i file che iniziano sequence_1e finiscono con .hmf.


Globbing è il processo in cui la shell prende un modello e lo espande in un elenco di nomi di file corrispondenti a quel modello. Non confonderlo con le espressioni regolari, che è diverso. Se trascorri gran parte del tuo tempo bash, Wooledge Wiki ha una buona pagina sui globbing (espansione del nome del percorso) . Se desideri la massima portabilità, ti consigliamo di leggere anche le specifiche POSIX sulla corrispondenza dei modelli /.


Nel caso improbabile che si verifichi un errore "Elenco argomenti troppo lungo" , è possibile dare un'occhiata a BashFAQ 95 , che risolve questo problema. La soluzione più semplice consiste nel suddividere il modello glob in più blocchi più piccoli, fino a quando l'errore scompare. Nel tuo caso, potresti probabilmente scartare la partita per prefisso le cifre da 0 a 9, come segue:

for c in {0..9}; do rm sequence_1_"$c"*.hmf; done
rm sequence_1*.hmf  # catch-all case

Questo è un lavoro molto intelligente attorno all'errore "lista argomenti troppo lunga". Nel mio caso, ho ventimila file, quindi immagino che dovrei usare un ciclo for da 0, .., 20. Destra?
Paul,

@Paul Bene, basta dividere l'elenco in tutti i pezzi di cui hai bisogno, anche se ad un certo punto l' findapproccio diventa più facile di indovinare e controllare.
jw013,

14

Sebbene la risposta di jw013 sia corretta wrt globbing, quel comando potrebbe fallire se hai migliaia di corrispondenze: la riga di comando espansa rm sequence_1_0001.hmf sequence_1_0002.hmf ... generata dalla shell potrebbe essere semplicemente troppo grande.

Come suggerito da Dom, puoi anche usare l' -deleteopzione con find:

find . -maxdepth 1 -type f -name 'sequence_1*.hmf' -delete

Entrambi -maxdepthe -delete, sebbene non nello standard POSIX, sono abbastanza comuni nelle findimplementazioni in natura. Le distribuzioni Linux usano generalmente GNU find, che certamente supporta queste opzioni.


2
Se puoi, usa l'opzione -delete per trovare, non si biforca per ogni file ...
Dom

Aggiunto, evviva. Sembra che -deletedovrebbe essere supportato su recenti sistemi GNU e BSD, mentre -print0è solo GNU. Quindi è probabilmente anche più portatile (anche se non dovrebbe fare la differenza per l'OP).
Inutile

Almeno la ricerca di OS X ha -print0, ma non è inclusa in POSIX.
Lri,

5
rm sequence_1_{0000..0999}.hmf
rm sequence_1_{1000..1999}.hmf
rm sequence_1_{2000..2999}.hmf
...

funzionerebbe anche in Bash.


L'espansione del controvento richiede bash, e credo che la forma zero imbottita abbia bisogno della versione 4.
jw013,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.