Comando MS-DOS per eliminare tutti i file tranne uno


25

Esiste un comando MS-DOS che mi consente di eliminare tutti i file tranne uno?

Considera come esempio i seguenti file:

a.001  
a.002  
a.003  
a.exe  
a.c  

Esiste un comando per eliminare tutti i file tranne a.c?

Risposte:


36

È possibile utilizzare i comandi fore ifper eseguire ciò:

for %i in (*) do if not "%~i" == a.c del "%~i"

Questo passa attraverso la directory corrente e confronta ogni nome di file con ac. Se non corrisponde, il file viene eliminato.


+1 non avrei mai pensato di usarlo per una semplice eliminazione ... Un sacco di buone risposte qui!
William Hilsum,

4
@Wil, quando inizi a usarlo forregolarmente ti vengono in mente tutti i tipi di scenari folli. :)
Kevin,

4
@ Mike, vuoi qualcosa del tipo "per% i in (A: \ Some \ Path \ *) se no% ~ nxi == ac del% i" Nota che il percorso termina in *, per ottenere i file in quella cartella e che il confronto è contro% ~ nxi, il nome senza percorso. Per distruttivo per loop come questo, è una buona idea fare "for ... do echo% i" per vedere quali file saranno interessati prima di eseguire il comando "for ... do if ... del% i".
Kevin,

1
Uso miglioredel "%i"
Mugen,

1
Se è necessario che l' IFistruzione non faccia distinzione tra maiuscole e minuscole, modificarla in IF /I.
jep

16

È possibile impostare il file per la lettura solo prima di eliminare tutto

attrib +r a.c
del *.*
attrib -r a.c

10

No, non c'è. Farei una directory, copierei il file importante in esso, lo cancellerei . e spostare indietro il file. Quindi eliminare il file temporaneo.

mkdir temp
move a.c temp
erase *.*
move temp\* .
rmdir temp

1
+1 grezzo e tecnicamente @Feiht ladro dice un modo migliore di farlo (quindi ho anche dato +1 lì), ma per la velocità, questo è il modo in cui lo farei.
William Hilsum,

3
FOR %f IN (*.*) DO IF NOT [%f]==[a.c] DEL /Q %f

1
che beneficio sono i []?
barlop

1
@barlop: %fpotrebbe contenere spazi nel nome file.
paradroid

@paradroid no che non aiuta per questo se [4 r] == [4 r] echo uguale Ho visto qualcosa di simile fatto da alcuni, come con. invece di []. Potrei indovinare il perché, ma preferirei sentirlo da qualcuno che lo fa.
barlop

@barlop: non ho idea di cosa tu abbia appena scritto lì, ma le parentesi quadre funzionano esattamente come farebbero le virgolette.
paradroid

@paradroid C: \> se [4 r] == [4 r] echo abc <ENTER> fornisce il risultato "r] == [4 era imprevisto in questo momento." Considerando che C: \> se "4 r" == "4 r" echo abc restituisce abc. Quindi cosa ti fa pensare che funzionino in qualche modo come le virgolette? Anche C: \> se [ab] == [ab] echo abc <- non funziona genera un errore simile. b] == [a era imprevisto in questo momento. Quindi cosa ti fa pensare che funzionino come virgolette?
barlop

1
FOR /F "tokens=1-4" %%a in ('dir /a:-d /b /s %app_path%^|find /v "%file%"') DO Del /q %%a %%b %%c %%d

Penso che questo sarebbe probabilmente utile, se fosse spiegato cosa fa. Sembra che attraversi un intero albero di cartelle, che è quello che voglio. %app_path%e %file%sono la radice dell'albero da attraversare e il file per evitare l'eliminazione, rispettivamente. Cos'è il ^, e perché stiamo passando quattro token per file al Delcomando?
LarsH,

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.