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 grepa rm -f. Ad esempio, se alcuni nomi di file iniziano con "abc.log"e altri con "ABC.log", grepconsente 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 -fcomando.
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 listfile 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 listfile, 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 bara rm -f 'foo bar'.