Comando de MS-DOS para eliminar todos los archivos excepto uno

25

¿Existe un comando de MS-DOS que me permite eliminar todos los archivos excepto uno?

Considere como ejemplo los siguientes archivos:

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

¿Hay un comando para eliminar todos los archivos excepto a.c?

nunos
fuente

Respuestas:

36

Puede usar los comandos fory ifpara lograr esto:

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

Esto pasa por el directorio actual y compara cada nombre de archivo con ac Si no coincide, el archivo se elimina.

Kevin
fuente
+1 nunca hubiera pensado en usar esto para una simple eliminación ... ¡Un montón de buenas respuestas aquí!
William Hilsum
44
@Wil, cuando comienzas a usarlo forregularmente, se te ocurren todo tipo de escenarios locos. :)
Kevin
44
@ Mike, quieres algo como "para% i en (A: \ Some \ Path \ *) si no% ~ nxi == ac del% i" Tenga en cuenta que la ruta termina en *, para obtener los archivos en esa carpeta , y que la comparación es contra% ~ nxi, el nombre sin ruta. Para destructivos para bucles como este, es una buena idea hacer "for ... do echo% i" para ver qué archivos se verán afectados antes de ejecutar el comando "for ... do if ... del% i".
Kevin
1
Mejor usodel "%i"
Mugen
1
Si necesita que la IFdeclaración no distinga entre mayúsculas y minúsculas, cámbiela por IF /I.
jep
16

Puede configurar el archivo para que se lea solo antes de eliminar todo

attrib +r a.c
del *.*
attrib -r a.c
feiht ladrón
fuente
10

No, no hay Haría un directorio, copiaría el archivo importante en él, lo borraría . y mueva el archivo hacia atrás. Luego elimine el archivo temporal.

mkdir temp
move a.c temp
erase *.*
move temp\* .
rmdir temp
David Pfeffer
fuente
1
+1 crudo y técnicamente el ladrón @Feiht dice una mejor manera de hacerlo (así que también dio +1 allí), pero para la velocidad, esta es la forma en que lo haría.
William Hilsum
3
FOR %f IN (*.*) DO IF NOT [%f]==[a.c] DEL /Q %f
Carlos Gutiérrez
fuente
1
¿Qué beneficio tienen los []?
barlop
1
@barlop: %fpodría tener espacios en el nombre del archivo.
paradroid
@paradroid no, eso no ayudará para eso si [4 r] == [4 r] echo igual he visto algo similar hecho por algunos, como con. en lugar de []. Podría adivinar por qué, pero prefiero escucharlo de alguien que lo hace.
barlop
@barlop: No tengo idea de lo que acabas de escribir allí, pero los corchetes funcionan igual que las comillas.
paradroid
@paradroid C: \> if [4 r] == [4 r] echo abc <ENTER> da el resultado "r] == [4 fue inesperado en este momento". Mientras que C: \> if "4 r" == "4 r" echo abc da el resultado abc. Entonces, ¿qué te hace pensar que de alguna manera funcionan como las comillas? Incluso C: \> si [ab] == [ab] echo abc <- no funciona da un error similar. b] == [a fue inesperado en este momento. Entonces, ¿qué te hace pensar que funcionan como citas?
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
Darth
fuente
Creo que esto probablemente sería útil si se explicara lo que hace. Parece que atraviesa un árbol de carpetas completo, que es lo que quiero. %app_path%y %file%son la raíz del árbol para atravesar, y el archivo para evitar su eliminación, respectivamente. ¿Cuál es el ^y por qué estamos pasando cuatro tokens por archivo al Delcomando?
LarsH
0

Para la velocidad, uso delen :

delen /! a.c

TCC / LE también tiene undelcomandomás poderoso:

del /[!a.c] *
paradroid
fuente
del /[!a.c] *yeldsInvalid switch - "[!a.c]".
karlphillip
@karlphillip: Funciona bien, "en TCC / LE" .
paradroid
¡Ajá! No vi ese comentario antes, gracias hermano.
karlphillip