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" 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 .
-d"\nopzione risolve il problema degli spazi.
grep -P(Perl regex). grep -Epotrebbe funzionare in questo caso.
-Icon xargse 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 rmche 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
xargsapproccio 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.