Comando do MS-DOS para excluir todos os arquivos, exceto um

25

Existe um comando do MS-DOS que permita excluir todos os arquivos, exceto um?

Considere como um exemplo os seguintes arquivos:

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

Existe um comando para excluir todos os arquivos, exceto a.c?

nunos
fonte

Respostas:

36

Você pode usar os comandos fore ifpara fazer isso:

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

Isso passa pelo diretório atual e compara o nome de cada arquivo com um ac. Se não corresponder, o arquivo será excluído.

Kevin
fonte
O +1 nunca pensou em usá-lo para uma simples exclusão ... Cargas de boas respostas aqui!
William Hilsum
4
@Wil, quando você começa a usar forregularmente, cria todos os tipos de cenários loucos para isso. :)
Kevin
4
@ Mike, você deseja algo como "para% i in (A: \ Some \ Path \ *) faça se não% ~ nxi == ac del% i" Observe que o caminho termina em * para obter os arquivos nessa pasta e que a comparação é contra% ~ nxi, o nome sem caminho. Para loops destrutivos como esse, é uma boa ideia fazer "for ... do echo% i" para ver quais arquivos serão afetados antes de executar o comando "for ... do if ... del% i".
Kevin
1
Melhor usodel "%i"
Mugen
1
Se você precisar que a IFdeclaração não diferencie maiúsculas de minúsculas, altere-a para IF /I.
jep 20/09/18
16

Você pode definir o arquivo como somente leitura antes de excluir tudo

attrib +r a.c
del *.*
attrib -r a.c
ladrão feiht
fonte
10

Não, não existe. Eu criava um diretório, copiava o arquivo importante para ele, apagava . e mova o arquivo de volta. Em seguida, exclua o arquivo temporário.

mkdir temp
move a.c temp
erase *.*
move temp\* .
rmdir temp
David Pfeffer
fonte
1
+1 em bruto e tecnicamente o ladrão @Feiht diz uma maneira melhor de fazê-lo (também deu +1 lá), mas, para velocidade, é assim que eu faria.
William Hilsum
3
FOR %f IN (*.*) DO IF NOT [%f]==[a.c] DEL /Q %f
Carlos Gutiérrez
fonte
1
que benefício são os []?
barlop
1
@ barlop: %fpode ter espaços no nome do arquivo.
Paradroid
@paradroid não, isso não vai ajudar por isso, se [4 r] == [4 r] eco igual eu já vi similar feito por alguns, como com. ao invés de []. Eu poderia adivinhar o porquê, mas eu prefiro ouvir isso de alguém que faz isso.
barlop 7/09/11
@ Barlop: Eu não tenho idéia do que você acabou de digitar lá, mas os colchetes funcionam como aspas.
Paradroid
@paradroid C: \> se [4 r] == [4 r] eco abc <ENTER> fornece o resultado "r] == [4 foi inesperado no momento." Enquanto C: \> se "4 r" == "4 r" echo abc fornece o resultado abc. Então, o que faz você pensar que eles funcionam como as aspas funcionariam? Mesmo C: \> se [ab] == [ab] echo abc <- não funcionar gera erro semelhante. b] == [a era inesperado no momento. Então, o que faz você pensar que eles funcionam como aspas?
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
fonte
Eu acho que isso provavelmente seria útil, se fosse explicado o que faz. Parece que ele atravessa uma árvore de pastas inteira, que é o que eu quero. %app_path%e %file%são a raiz da árvore a percorrer e o arquivo para evitar a exclusão, respectivamente. O que é ^e por que estamos passando quatro tokens por arquivo para o Delcomando?
LarsH
0

Para velocidade, eu uso delen :

delen /! a.c

O TCC / LE também possui umdelcomandomais poderoso:

del /[!a.c] *
paradroid
fonte
del /[!a.c] *yeldsInvalid switch - "[!a.c]".
karlphillip
@karlphillip: Funciona bem "em TCC / LE" .
Paradroid
Aha! Não vi esse comentário antes, obrigado mano.
karlphillip