Come posso eliminare tutti i file con una particolare estensione in una determinata cartella?


36

Se imposto la directory corrente / di lavoro (navigando su di essa utilizzando cd) su una directory particolare e quindi digitare:

rm *.xvg

Cosa farà questo comando? È vero che il comando sopra cancellerà solo i file con l'estensione .xvg solo nella directory di lavoro?

Ero nervoso per provare questo prima di chiedere, perché voglio essere assolutamente sicuro che il comando sopra eliminerà solo i .xvgfile SITUATI NELLA DIRECTORY DI LAVORO .

Risposte:


34

Sì, rm *.xvgsarà solo eliminare i file con l'estensione specificata nella corrente directory.

Un buon modo per essere sicuri di trovarti davvero nella directory che desideri eliminare i tuoi file è usare il pwdcomando che visualizzerà la tua directory corrente e quindi fare una lsverifica per trovare i file che ti aspetti.

Se sei un po 'preoccupato di emettere il rmcomando, ci sono 2 cose che puoi fare:

  1. digitare ls *.xvgper visualizzare un elenco di quali file sarebbero interessati da questo comando.

  2. A meno che non si disponga di molti file, è sempre possibile utilizzare l' -iopzione della riga di comando per rm(esiste anche per cpe mv). L'utilizzo rm -i *.xvgti richiederebbe per ogni singolo file se fosse corretto eliminarlo, quindi potresti essere sicuro che nulla che non ti aspettavi fosse cancellato. (Questo sarà noioso se hai molti file :)


1
Inoltre: rm -f {*.xvg,.*.xvg}per rimuovere anche i file nascosti. E rm -R -f {*.xvg,.*.xvg}per rimuovere anche le directory.
Dor

20

Non è necessario passare alla directory, basta usare

rm /some/dir/*.xvg 

Nel caso in cui si abbia un errore di battitura o un errore simile nel percorso, dove / som / dir non esiste:

cd /som/dir
rm *.xvg

cancellerà accidentalmente tutti i file .xvg nella directory corrente. Il primo comando no, e non è necessario eseguire nuovamente il cd.

Un modo alternativo sarebbe usare find:

find /some/dir/ -maxdepth 1 -type f -name "*.xvg" -delete 

find / some / dir / -maxdepth 1 -type f -name "* .xvg" -delete ha funzionato per me! utilizzare -maxdepth "n" per eliminare i file corrispondenti nella sottodirectory se viene fornito il percorso
Vinay

3

Sì, rm *.xvgeliminerà solo i file che terminano con .xvgnella 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 arg3all'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 *.barnella 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 rmcomando.

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 **/*.barmostrerà un elenco di tutti i file che finiscono .barin tutte le sottocartelle. Quindi digitando rm **/*.barin bash abilitato globstar si elimineranno effettivamente in modo ricorsivo tutti i file corrispondenti nelle sottocartelle.


1

Comando:

  rm ./*.pgm

per me va bene

Comando:

rm *.pgm

dà il comando di errore (in polacco, tradotto):

rm: wrong option - '1'
Use "rm ./-1000.pgm" to delete the file '-1000.pgm'.
Write "rm --help" for information.

nel

bash --version
GNU bash, wersja 4.4.19(1)-release (x86_64-pc-linux-gnu)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.