Usando curingas com o comando rmdir ou rd

40

Digamos que haja alguma pasta na D:unidade:

D:\Air
D:\Abonden
D:\All
D:\Whatever

Desejo excluir todas as pastas começando com "A" (incluindo todas as subpastas e arquivos). Eu tentei este comando:

rmdir D:\A* /s /q

No entanto, recebo um erro :(

O nome do arquivo, nome do diretório ou sintaxe do rótulo do volume está incorreto.

O delcomando funciona com *, mas eu preciso excluir as pastas também.
Existe uma maneira de conseguir isso através do rmdircomando?

serdar
fonte
2
Uniformidade e bom senso nunca estiveram em jogo no desenvolvimento dos shells de comandos do Windows ou do DOS. A parte triste é que havia sistemas de modelos por aí quando essas cápsulas foram desenvolvidas, que lançariam luz sobre projetos inteligentes. É claro que a concha é apenas um exemplo do horrível ou inexistente processo de pensamento que ocorreu ao juntar esse lixo - eu gostaria de poder lhe dizer o que realmente penso, ha ha.
Rick O'Shea

Respostas:

33
cd c:\temp
for /f %i in ('dir /a:d /s /b A*') do rd /s /q %i

Use isso para testar:

for /f %i in ('dir /a:d /s /b A*') do echo rd /s /q %i

Isso direcionará os comandos a serem executados no prompt de comando e permitirá que você veja o que está acontecendo.

Lembre-se de que isso também pesquisará subpastas como "C: \ temp \ jjj \ aaa" e excluirá a pasta aaa. Se você quiser apenas olhar para as pastas de nível superior "C: \ temp \ aaa", remova "/s"o comando.

A chave para isso é o A *, onde você colocaria sua string de pesquisa. Isso aceitará curingas como aaa*, aaa*e *aaa*se você desejar.

Fazer87
fonte
Como está, o comando será interrompido se o nome do caminho / pasta contiver caracteres de espaço.
precisa
1
Podemos adicionar "SE NÃO EXISTIR para EFO" para A *?
Serdar
3
Isso funciona se o caminho contiver caracteres de espaço: for / f "delims ="% i in ('dir / a: d / s / b A *') do rd / s / q "% i"
Luis Cantero - MSFT
5
Eu gostaria apenas de acrescentar que, se executar este a partir de dentro de um arquivo de lote , então você precisa usar dois sinais de porcentagem de modo que o comando se tornafor /f %%i in ('dir /a:d /s /b A*') do rd /s /q %%i
Fred Clausen
não há necessidade de flag uso 'w / sub' duas vezes :)
lunicon
25

Excluindo pastas usando curingas

A rmdir/ rdcomando por si só não suporta caracteres curinga (isto é, *e ?). Você pode solucionar essa limitação envolvendo-a em um forloop.

Exemplo de uso

for /d %G in ("X:\A*") do rd /s /q "%~G"

Nota Ao excluir arquivos e pastas, convém substituir o rdcomando echoprimeiro. Dessa forma, você pode garantir que qualquer coisa que não deva ser excluída realmente o faria.

Padrões múltiplos

Para excluir várias pastas que correspondem a diferentes padrões, a sintaxe não é muito diferente. Como o @dbenham apontou corretamente, um comando de uma linha é suficiente. Você também pode especificar caminhos diferentes:

for /d %G in ("X:\A*","Y:\Whatever\B*","Z:\C?D") do rd /s /q "%~G"

Bônus - Verificando a existência da pasta

Caso deseje verificar se existem pastas específicas, você pode usar o seguinte comando:

dir /b /a:d "X:\A*" >nul 2>&1 && echo Folders exist. || echo No folders found.

Leitura adicional

and31415
fonte
Podemos adicionar "SE NÃO EXISTIR para EFO" para A *?
Serdar
Por exemplo, supomos que não exista uma pasta iniciada com uma letra. Portanto, o comando deve ir para B *. Eu não sei se eu poderia explicar ou não :(
serdar 06/06
1
+1 de mim. Eu não entendo o voto negativo. Embora você possa fazer vários padrões com seus comandos FOR /De simples FOR /D /R. Basta usar in( "A*" "B*" "C?D" ).
dbenham
1
Na verdade, você precisa da /Ropção porque a subpasta que corresponde à máscara pode estar sob um pai que não.
precisa saber é o seguinte
5
AVISO: Se você quiser usar esta solução em um arquivo .bat, precisará usar %% G em vez de% G, veja aqui
ValarDohaeris
18

Como ninguém falou ao OP sobre forfiles ainda ?!

forfiles /P D:\ /M A* /C "cmd /c if @isdir==TRUE rmdir /s /q @file"

/ P é o nome do caminho - onde a pesquisa começa
/ M é uma máscara de pesquisa, procurando arquivos que começam com A
/ C é o comando para executar
/ S são subpastas recursivas (não foram incluídas aqui, porque o op não pediu)
JJS
fonte
2
Esta é uma excelente resposta, deve ser a aceita.
eacousineau
1
Solução muito boa e bem explicada.
Andreas
Resposta útil: D, mas a resposta da OMI, for /dcomo na and31415, é mais limpa e mais eficiente.
Superole 10/11/16
12

A resposta adn31415 está correta, mas é interrompida se você colocar isso em um script de lote ou cmd. Eu bati minha cabeça por horas até descobrir que é assim que você a usa.

Na janela de comando do DOS:

for /d %G in ("X:\A*") do rd /s /q "%~G"

No script em lote ou cmd:

for /d %%G in ("X:\A*") do rd /s /q "%%~G"

Se você quiser colocá-lo em um arquivo ".bat" ou ".cmd", precisará dobrar os caracteres "%".

Sam B
fonte
3
Você economizou meu tempo para o script em lote!
Tuan
cara sem problemas :) É por isso que postou a resposta como eu sabia que não era óbvia e mais pessoas vão se deparar com ela.
Sam B
Podemos adicionar uma exclusão para não ser excluída?
serdar
SET / P PC = INSERIR IP OU NOME DO HOST para / d %% a em ("\\% PC% \ D $ \ A *. *") Do rd / s / q "%% a" Este script funciona corretamente ?
serdar