Sì, rm *.xvg
eliminerà solo i file che terminano con .xvg
nella directory corrente. Ecco perché.
Quando si digita un comando come questo, il lavoro viene suddiviso tra la shell che si sta utilizzando (supponiamo bash) e il comando binario.
È possibile individuare il file binario digitando which rm
. Questo piccolo programma si occupa di scollegare i file. Programmi come questo possono essere avviati dalla riga di comando e possono leggere un elenco di argomenti prog arg1 arg2 arg3
all'avvio. Nel caso di rm
, vengono interpretati come un elenco di nomi di file completi da eliminare. Quindi, se siete in una directory contenente il file foo.bar
, di battitura delete 'foo.*'
si tradurrà in rm: foo.*: No such file or directory
. Nota le virgolette singole attorno al modello di file, dicono alla shell di passare l'argomento alla shell così com'è.
Tuttavia, se si digita rm *.bar
nella stessa directory, eliminerà il file. Quello che sta succedendo qui è che la tua shell, che è il programma che stai usando per digitare i comandi, sta eseguendo alcune trasformazioni prima di passare gli argomenti al comando. Uno di questi si chiama 'espansione del nome del file', altrimenti noto come 'globbing'. Puoi vedere un elenco di espansioni di nomi di file bash qui . Una delle espansioni più comuni è *
, che viene espansa in nomi di file nella directory corrente.
Un modo semplice per guardare i globs sul lavoro è usare echo
, che stampa indietro tutti gli argomenti passati ad esso attraverso la shell. Quindi digitando echo *
nella stessa directory verrà generato foo.bar
. Quindi quando si digita rm *.bar
, ciò che sta realmente accadendo è che la shell espande l'elenco degli argomenti a foo.bar
, quindi lo passa al rm
comando.
Esistono alcuni modi per controllare il globbing. Nelle versioni recenti di bash, ad esempio, è possibile attivare un'opzione chiamata globstar che farà l'espansione ricorsiva. La digitazione echo **/*.bar
mostrerà un elenco di tutti i file che finiscono .bar
in tutte le sottocartelle. Quindi digitando rm **/*.bar
in bash abilitato globstar si elimineranno effettivamente in modo ricorsivo tutti i file corrispondenti nelle sottocartelle.
rm -f {*.xvg,.*.xvg}
per rimuovere anche i file nascosti. Erm -R -f {*.xvg,.*.xvg}
per rimuovere anche le directory.