Se si desidera eliminare tutti i file i cui nomi corrispondono a una forma particolare, un carattere jolly (glob pattern) è la soluzione più semplice. Qualche esempio:
$ rm -f abc.log.* # Remove them all
$ rm -f abc.log.2012* # Remove all logs from 2012
$ rm -f abc.log.2012-0[123]* # Remove all files from the first quarter of 2012
Le espressioni regolari sono più potenti dei caratteri jolly; puoi alimentare l'output di grep
a rm -f
. Ad esempio, se alcuni nomi di file iniziano con "abc.log"
e altri con "ABC.log"
, grep
consente di eseguire una corrispondenza senza distinzione tra maiuscole e minuscole:
$ rm -f $(ls | grep -i '^abc\.log\.')
Ciò causerà problemi se uno qualsiasi dei nomi di file contiene caratteri divertenti, inclusi gli spazi. Stai attento.
Quando lo faccio, ls | grep ...
eseguo prima il comando e controllo che produca l'output che desidero, specialmente se sto usando rm -f
:
$ ls | grep -i '^abc\.log\.'
(check that the list is correct)
$ rm -f $(!!)
dove si !!
espande al comando precedente. Oppure posso digitare freccia su o Ctrl-P e modificare la riga precedente per aggiungere il rm -f
comando.
Questo presuppone che tu stia usando la shell bash. Alcune altre shell, in particolare csh e tcsh e alcune vecchie shell derivate da sh, potrebbero non supportare la $(...)
sintassi. È possibile utilizzare la sintassi di backtick equivalente:
$ rm -f `ls | grep -i '^abc\.log\.'`
Il $(...)
sintassi è più facile da leggere e se sei veramente ambizioso può essere annidata.
Infine, se il sottoinsieme di file che desideri eliminare non può essere facilmente espresso con un'espressione regolare, un trucco che uso spesso è elencare i file in un file di testo temporaneo, quindi modificarlo:
$ ls > list
$ vi list # Use your favorite text editor
Posso quindi modificare il list
file manualmente, lasciando solo i file che voglio rimuovere, e poi:
$ rm -f $(<list)
o
$ rm -f `cat list`
(Anche in questo caso, si presume che nessuno dei nomi di file contenga caratteri divertenti, in particolare spazi.)
Oppure, durante la modifica del list
file, posso aggiungere rm -f
all'inizio di ogni riga e poi:
$ . ./list
o
$ source ./list
La modifica del file è anche un'opportunità per aggiungere virgolette dove necessario, ad esempio passando rm -f foo bar
a rm -f 'foo bar'
.