Se desideri eliminare tutti i file i cui nomi corrispondono a un formato particolare, un carattere jolly (modello globale) è la soluzione più semplice. Alcuni esempi:
$ 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 alcuni con "ABC.log"
, grep
ti permette di fare 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, eseguo ls | grep ...
comando prima e controlla che produca l'output che voglio -- soprattutto 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 rm -f
comando.
Ciò presuppone che tu stia utilizzando la shell bash. Alcune altre shell, in particolare csh e tcsh e alcune vecchie shell derivate da sh, potrebbero non supportare il $(...)
sintassi. Puoi usare la sintassi del backtick equivalente:
$ rm -f `ls | grep -i '^abc\.log\.'`
Il $(...)
la sintassi è più facile da leggere e se sei davvero ambizioso può essere nidificata.
Infine, se il sottoinsieme di file che desideri eliminare non può essere facilmente espresso con un'espressione regolare, un trucco che utilizzo 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`
(Di nuovo, questo presuppone che nessuno dei nomi di file contenga caratteri divertenti, in particolare spazi.)
Oppure, quando si modifica il 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 cambiando rm -f foo bar
a rm -f 'foo bar'
.
Basta usare la selezione su più righe in sublime per combinare tutti i file in una singola riga e aggiungere uno spazio tra ogni nome di file e quindi aggiungere rm
all'inizio dell'elenco. Questo è particolarmente utile quando non c'è uno schema nei nomi dei file che vuoi eliminare.
[$]> rm abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28 abc.log.2012-03-29 abc.log.2012-03-30 abc.log.2012-04-02 abc.log.2012-04-04 abc.log.2012-04-05 abc.log.2012-04-09 abc.log.2012-04-10
Bash supporta tutti i tipi di caratteri jolly ed espansioni.
Il tuo caso esatto verrebbe gestito dall'espansione delle parentesi graffe, in questo modo:
$ rm -rf abc.log.2012-03-{14,27,28}
Quanto sopra verrebbe espanso a un singolo comando con tutti e tre gli argomenti, ed equivale a digitare:
$ rm -rf abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28
È importante notare che questa espansione viene eseguita dalla shell, prima di rm
è persino caricato.
Usa un carattere jolly (*
) per abbinare più file.
Ad esempio, il comando seguente eliminerà tutti i file i cui nomi iniziano con abc.log.2012-03-
.
rm -f abc.log.2012-03-*
Consiglierei di eseguire ls abc.log.2012-03-*
per elencare i file in modo che tu possa vedere cosa eliminerai prima di eseguire rm
comando.
Per maggiori dettagli vedere la pagina man di Bash sull'espansione del nome file.