Risposte:
È 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:
ls
elenca tutti i file (uno per riga poiché il risultato viene reindirizzato).
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.
xargs -d"\n" rm
viene eseguito rm line
una volta per ogni line
piping ad esso.
Dove sbaglio?
Per cominciare, rm
non 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
, AA
ecc e anche una stringa vuota.
Per ulteriori informazioni, visitare Regular-Expressions.info .
-d"\n
opzione risolve il problema degli spazi.
grep -P
(Perl regex). grep -E
potrebbe funzionare in questo caso.
-I
con xargs
e testare sempre prima con comandi non letali:xargs -d"\n" -I {} echo "{}"
ls
? Vedi questa domanda che punta a questo articolo . A causa delle insidie rm
che potresti non volere.
O usando find
:
find your-directory/ -name 'A*[0-9][0-9]' -delete
Questa soluzione si occuperà di nomi di file strani .
-type f
xargs
approccio con rm -f
.
Vedi la sezione di espansione del nome file nella pagina man di bash:
rm A*[0-9][0-9]
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.