Come eliminare i file dalla riga di comando con espressioni regolari?


18

Diciamo che ho 20 file di nome FOOXX, dove XX è il numero del file, ad esempio 01, 02 ecc.

Al momento, se voglio eliminare tutti i file inferiori al numero 10, questo è facile e utilizzo solo un carattere jolly, ad esempio rm FOO0 *

Tuttavia, se voglio eliminare file specifici in un intervallo, ad esempio 13-15, questo diventa più difficile.

rm FPP [13-15] non funziona e mi chiede se desidero eliminare tutti i file. Likewse rm FOO1 [3-5] desidera eliminare tutti i file che iniziano con FOO1

Quindi, qual è il modo migliore per eliminare intervalli di file come questo?

Ho provato sia con bash che con zsh e non penso che differiscano così tanto per un compito così basilare?


"... rm FOO1 [3-5] desidera eliminare tutti i file che iniziano con FOO1" Questo non ha senso, e certamente non è il caso qui.
Ignacio Vazquez-Abrams,

@Ignacio sì- Mi piacerebbe vedere che il set di caratteri ha quell'ordine di confronto!
kmarsh

Risposte:


31

In bash puoi usare:

rm FOO1 {3..5}

o

rm FOO1 {3,4,5}

per eliminare FOO13, FOO14 e FOO15.

La parentesi di espansione di Bash è documentata qui .


2
O addirittura rm FOO{13..15}.
Ignacio Vazquez-Abrams,

Questo vale anche per ZSH?
Jack,

@ Jack: Sì, lo è.
In pausa fino a nuovo avviso.

@Jack: bashcomandi formano un sottoinsieme di zcomandi shell.
abhinavkulkarni,

Quindi ho bisogno di imparare sia la regex che la sintassi globbing. Boohoo. :)
Aditya MP

13

Per i lettori futuri, il findcomando può anche eliminare i file. Ho optato per questo per un problema simile:

find . -type f -regex '...' -delete

ma la risposta scelta è la risposta più semplice a questa domanda.


La risposta scelta è valida solo per i file che seguono una convenzione di denominazione. Grazie alla tua risposta, ho potuto semplicemente eliminare tutti i file oggetto in una directory. (nel mio caso sono appena andato find . -name "*.o" -deletee ha funzionato come un incantesimo)
John Hamilton,

6

ls | grep regex | xargs rm


6
Dovresti usarlo find -regex ... -print0 | xargs -0 ...per questo, altrimenti non riesce per i nomi di file con spazi.
In pausa fino a nuovo avviso.

1
Naturalmente, se hai intenzione di usarlo, findpuoi anche semplicemente usare -exec.
Ignacio Vazquez-Abrams,

Nel mio caso i file avevano spazi e la modifica del delimitatore risolve il problema degli spazi: ls | grep regex | xargs --delimiter = '\ n' rm
Anake


@evilsoup, +1 per l'aggiunta di quell'avvertimento, ma chi inserisce una nuova riga nel nome di un file?
Iulian Onofrei,
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.