Elimina i file con espressione regolare


39

Ho provato a eliminare i file che iniziano con A e terminano con 2 numeri, ma non fanno nulla.
Cosa ho provato:

rm ^A*[0..9]2$

Dove sbaglio?

Risposte:


54

È possibile utilizzare il comando seguente per eliminare tutti i file corrispondenti ai propri criteri:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d"\n" rm

Come funziona:

  1. ls elenca tutti i file (uno per riga poiché il risultato viene reindirizzato).

  2. grep -P "^A.*[0-9]{2}$" filtra l'elenco dei file e lascia solo quelli che corrispondono all'espressione regolare ^A.*[0-9]{2}$

    • .*indica un numero qualsiasi di occorrenze di ., dove .è un carattere jolly che corrisponde a qualsiasi carattere.

    • [0-9]{2}indica esattamente due occorrenze di [0-9], cioè qualsiasi cifra.

  3. xargs -d"\n" rmviene eseguito rm lineuna volta per ogni linepiping ad esso.

Dove sbaglio?

Per cominciare, rmnon accetta un'espressione regolare come argomento. Oltre al jolly *, ogni altro personaggio viene trattato alla lettera.

Inoltre, la tua espressione regolare è leggermente disattivata. Ad esempio, *si intende qualsiasi occorrenza ...in un'espressione regolare, quindi A*corrisponde A, AAecc e anche una stringa vuota.

Per ulteriori informazioni, visitare Regular-Expressions.info .


3
Attenzione agli spazi nei nomi dei file.
slhck,

1
L' -d"\nopzione risolve il problema degli spazi.
Venerdì

1
Nota: alcune distro (come Mac OS) non hanno grep -P(Perl regex). grep -Epotrebbe funzionare in questo caso.
bluescrubbie,

1
Preferisco usare -Icon xargse testare sempre prima con comandi non letali:xargs -d"\n" -I {} echo "{}"
jozxyqk

1
Analisi ls? Vedi questa domanda che punta a questo articolo . A causa delle insidie rmche potresti non volere.
Kamil Maciorowski il

45

O usando find:

find your-directory/ -name 'A*[0-9][0-9]' -delete

Questa soluzione si occuperà di nomi di file strani .


4
Questa è un'ottima soluzione Lo preferisco perché è più semplice e puoi omettere il flag -delete alla fine per vedere se il tuo regex è corretto prima di eliminare in massa i tuoi file.
JAMESSTONEco

1
Inoltre hai più controllo su ciò che elimini, ad esempio aggiungendo-type f
Marco Sulla

Può essere usato per cancellare file e cartelle? Non funziona per cartelle non vuote.
Alex,

@Alex no, la directory deve essere vuota (non era comunque un requisito OP), puoi usare l' xargsapproccio con rm -f.
cYrus,


1

La soluzione con regexp è 200 volte migliore, anche se puoi vedere quale file verrà eliminato prima di usare il comando, tagliando la pipe finale:

ls | grep -P "^A.*[0-9]{2}$"

Quindi se è corretto basta usare:

ls | grep -P "^A.*[0-9]{2}$" | xargs -d "\n" rm

Questo è 200 volte migliore perché se lavori con Unix è importante sapere come usare grep. È molto potente se sai come usarlo.


1
Questo non sembra aggiungere molto al di là di quello che dice già la risposta di 4 anni di Dennis .
8

1
"200 volte" è piuttosto specifico. Molti altri comandi sono anche molto potenti, tutto ciò che devi fare è imparare come usarli.
Glenn Jackman,

1

Questo funziona sul mio mac:

rm $(ls | grep -e '^A*[0..9]2$')

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.