"Rm -rf" equivalente para Windows?

509

Eu preciso de uma maneira de excluir recursivamente uma pasta e seus filhos.

Existe uma ferramenta pré-construída para isso ou preciso escrever uma?

DEL /S não exclui diretórios.

DELTREE foi removido do Windows 2000+

FlySwat
fonte
1
Del / s (a) não funciona (está disponível apenas em algumas versões) ou (b) sai do diretório de nível superior, mas apaga tudo sob ele ou (c) deixa todos os diretórios enquanto exclui todos os arquivos?
Wnoise 19/09/08
@ Aaron, resposta c, você precisa usar o rmdir / s para remover diretórios e arquivos.
Wedge
31
Não é realmente a format c:instalação do Linux? Estou brincando, é claro.
Basile Starynkevitch 25/03

Respostas:

694

RMDIR ou RD se você estiver usando o prompt de comando clássico (cmd.exe):

rd /s /q "path"

Caminho RMDIR [/ S] [/ Q] [drive:]

Caminho RD [/ S] [/ Q] [drive:]

/ S Remove todos os diretórios e arquivos no diretório especificado, além do próprio diretório. Usado para remover uma árvore de diretórios.

/ Q Modo silencioso, não pergunte se está OK para remover uma árvore de diretórios com / S

Se você estiver usando PowerShell que você pode usar Remove-Item(que é alias para del, erase, rd, ri, rme rmdir) e leva um -Recurseargumento que pode ser curto para-r

rd -r "path"
Duncan Smart
fonte
84
Vale ressaltar que, para um grande número de arquivos, o rmdir / s / q geralmente é significativamente mais rápido que a operação equivalente "select dir, shift + delete" no explorer.
Cunha
9
Isso não exclui arquivos, como rm -rf, e também retorna um valor diferente de zero quando o diretório não existe, portanto rd /s /q foo && echo "yay"falhará se o diretório "foo" não existir.
Dirk Groeneveld
17
E se dir. não está vazio e alguns arquivos ficam Access is deniede outros The process cannot access the file because it is being used by another process?
Eugene
6
Eu apenas tentei isso em sete anos e você precisa fazer / S e / Q (Caps)
prefeito do ford
2
Mistificado aqui. Eu sei que tentei esse comando e não funcionou se houvesse arquivos na árvore de diretórios; agora eu volto e. . . magicamente parece funcionar. Alguém mais experimentou um comportamento inconsistente com isso ?!
Alex Hall
139

admin:

takeown /r /f folder
cacls folder /c /G "ADMINNAME":F /T
rmdir /s folder

Funciona para qualquer coisa, incluindo arquivos sys

Edição: Na verdade, eu encontrei a melhor maneira que também resolve o problema de caminho de arquivo muito longo também:

mkdir \empty
robocopy /mir \empty folder
wbkang
fonte
3
Meu heroi! E uma dica: Você cria a sua pasta vazia em C: \ esvaziar, em seguida, uma vez dentro de cada pasta louco, um pode apenas fazerrobocopy /mir c:\empty .
Léon Pelletier
Eles takeownme ajudaram enquanto eu copiava a pasta do sistema Linux com o rsync por engano e não tinha privilégios para remover essa pasta ... Nem mesmo a robocópia funcionava. Graças
Jarda
1
Resposta muito boa. Funciona. (todas as outras respostas da página não). Mas cacls está obsoleto. É possível fazer uma resposta contemporânea, por favor? A segunda variante já funciona e não é preterida.
Gangnus
Isso não faz nada por mim. Alguém poderia explicar como deve funcionar? (robocopy) - Pode eliminar conteúdo de pastas, mas não pastas si
Ralf
114

RMDIR [/S] [/Q] [drive:]path

RD [/S] [/Q] [drive:]path

  • /S Remove todos os diretórios e arquivos no diretório especificado, além do próprio diretório. Usado para remover uma árvore de diretórios.

  • /Q Modo silencioso, não pergunte se está OK para remover uma árvore de diretórios com /S

Jim McKeeth
fonte
13
Obrigado pela explicação do parâmetro. Infelizmente, a resposta aceita não faz isso.
Thomas
1
Resposta mais simples e perfeita para a pergunta. Deve ser o aceito.
Artif3x
19

Você pode instalar o cygwin, que possui rme também lsetc.

user17481
fonte
19

Vá para o caminho e acione este comando.

rd /s /q "FOLDER_NAME"

/ s: remove o diretório especificado e todos os subdiretórios, incluindo todos os arquivos. Use / s para remover uma árvore.

/ q: Executa o rmdir no modo silencioso. Exclui diretórios sem confirmação.

/? : Exibe ajuda no prompt de comando.

Sireesh Yarlagadda
fonte
9

Para excluir um diretório (se ele existe ou não), use o seguinte:

if exist myfolder ( rmdir /s/q myfolder )
Argila
fonte
6

rmdir /S /Q %DIRNAME%

Branan
fonte
6

A resposta aceita é ótima, mas supondo que você tenha o Node instalado, você pode fazer isso com muito mais precisão com a biblioteca de nós "rimraf", que permite padrões de globbing. Se você usa muito isso (eu uso), basta instalá-lo globalmente.

yarn global add rimraf

então, por exemplo, um padrão que eu uso constantemente:

rimraf .\**\node_modules

ou para uma linha única que permite evitar a instalação global, mas que demora um pouco mais para o download dinâmico do pacote:

npx rimraf .\**\node_modules
Artif3x
fonte
2
Uma solução sólida para o problema, pois é independente do sistema operacional.
Denialos 9/03/19
5

Tente este comando:

del /s foldername
Jeremy Ruten
fonte
trabalhou para mim em combinação w / rmdir / s / q, pois alguns arquivos estavam bloqueados e o rmdir falharia nesses. del / foldername colocou os arquivos bloqueados, que permitiram ao rmdir se livrar do diretório raiz. Agradável.
Bbqchickenrobot 18/03/2014
4

rmdir / s dirname

Brian Mitchell
fonte
4

Primeiro, vamos revisar o que rm -rffaz:

C:\Users\ohnob\things>touch stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>mkdir stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>ls -l
total 0

C:\Users\ohnob\things>rm -rf stuff.txt

Existem três cenários nos quais rm -rfé comumente usado o retorno esperado 0:

  1. O caminho especificado não existe.
  2. O caminho especificado existe e é um diretório.
  3. O caminho especificado existe e é um arquivo.

Eu vou ignorar toda a coisa das permissões, mas ninguém usa permissões ou tenta negar a si mesmo o acesso de gravação às coisas no Windows de qualquer maneira (OK, isso é uma piada ...).

Primeiro, defina ERRORLEVELcomo 0 e, em seguida, exclua o caminho apenas se existir, usando comandos diferentes, dependendo de ser ou não um diretório. IF EXISTnão define ERRORLEVELcomo 0 se o caminho não existir; portanto, ERRORLEVELé necessário definir primeiro como 0 para detectar corretamente o sucesso de uma maneira que imite o rm -rfuso normal . É necessário proteger o RDcom , IF EXISTporque RD, ao contrário rm -f, lançará um erro se o destino não existir.

O seguinte snippet de script supõe que DELPATH seja pré-citado. (Isso é seguro quando você faz algo parecido SET DELPATH=%1. Tente colocar ECHO %1um .cmde passar um argumento com espaços e veja o que acontece por si mesmo). Após a conclusão do snippet, você pode verificar se há falhas IF ERRORLEVEL 1.

: # Determine whether we need to invoke DEL or RD or do nothing.
SET DELPATH_DELMETHOD=RD
PUSHD %DELPATH% 2>NUL
IF ERRORLEVEL 1 (SET DELPATH_DELMETHOD=DEL) ELSE (POPD)
IF NOT EXIST %DELPATH% SET DELPATH_DELMETHOD=NOOP
: # Reset ERRORLEVEL so that the last command which
: # otherwise set it does not cause us to falsely detect
: # failure.
CMD /C EXIT 0
IF %DELPATH_DELMETHOD%==DEL DEL /Q %DELPATH%
IF %DELPATH_DELMETHOD%==RD RD /S /Q %DELPATH%

A questão é que tudo é mais simples quando o ambiente está em conformidade com o POSIX. Ou se você instalar um MSYS mínimo e apenas usá-lo.

binki
fonte
3

Aqui está o que você precisa fazer ...

Crie um arquivo em lotes com a seguinte linha

RMDIR /S %1

Salve seu arquivo em lotes como Remove.bate coloque-oC:\windows

Crie a seguinte chave do Registro

HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)

Inicie regedite atualize o valor padrão HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)\default com o seguinte valor

"c:\windows\REMOVE.bat" "%1"

É isso aí! Agora você pode clicar com o botão direito do mouse em qualquer diretório e usar a função RMDIR

Louis
fonte
3

Usando o PowerShell 5.1

 get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force

Substitua os logs pelo nome do diretório que você deseja excluir.

O get-childitem pesquisa o diretório filho com o nome recursivamente do caminho atual (.).

remove-item exclui o resultado.

Nova Iorque
fonte
2

Você pode instalar o GnuWin32 e usar os comandos * nix nativamente no Windows. Eu instalo isso antes de instalar qualquer outra coisa em uma cópia nova e minty do Windows. :)

epochwolf
fonte
2

USE POR SUA CONTA E RISCO. INFORMAÇÃO FORNECIDA 'NO ESTADO EM QUE SE ENCONTRA'. NÃO TESTADO EXTENSIVAMENTE.

Clique com o botão direito do mouse no ícone do Windows (geralmente no canto inferior esquerdo)> clique em "Windows PowerShell (Admin)"> use este comando (com o devido cuidado, você poderá excluir facilmente todos os seus arquivos se não for cuidadoso):

rd -r -include *.* -force somedir

Onde somedirestá o diretório não vazio que você deseja remover.

Observe que, com discos externos conectados ou com problemas, o Windows às vezes se comporta de maneira estranha - ele não comete um erro na exclusão (ou em qualquer tentativa de cópia), mas o diretório não é excluído (ou copiado) conforme as instruções. (Descobri que, nesse caso, pelo menos para mim, o comando dado por @n_y em sua resposta produzirá erros como 'get-childitem: o arquivo ou diretório está corrompido e ilegível'. Como resultado no PowerShell)

Roel Van de Paar
fonte
1

ATRASADO, MAS RESPOSTA IMPORTANTE a qualquer um que esteja com problemas para instalar pacotes npm na máquina Windows e se você estiver vendo o erro dizendo " rm -rf..." o comando não foi encontrado. Você pode usar o bash cli para executar o comando rm no Windows.

para usuários do npm, você pode alterar a configuração do npm npm config set script-shell "C:\Program Files\Git\bin\bash.exe"dessa maneira, se o pacote npm que você está tentando instalar tiver um script de pós-instalação que usa o rm -rfcomando, você poderá executar esse rmcomando sem precisar alterar nada no pacote npm ou desativar a configuração dos scripts pós-instalação. (Por exemplo, styled-componentsusa o rmcomando em seus scripts de pós-instalação)

Se você quiser apenas usar o rm comando, poderá usar facilmente o bash e passar os argumentos.

Então, sim, você pode usar o comando 'rm' no Windows.

AKC
fonte
0

aqui está o que funcionou para mim:

Apenas tente diminuir o comprimento do caminho. ou seja: :: Renomeie todas as pastas que levam a esse arquivo para os menores nomes possíveis. Diga os nomes de uma letra. Continue renomeando para cima na hierarquia de pastas. Com isso, você reduz efetivamente o comprimento do caminho. Agora, finalmente, tente excluir o arquivo imediatamente.

Gaurav Deochakke
fonte
-1

Também há deltree se você estiver em uma versão mais antiga do Windows.

Eu realmente gosto deste site para encontrar comandos: SS64: Del - Excluir arquivos

Jason Wadsworth
fonte
-2

del / s / q directorytobedeleted

Joe
fonte
2
Tente adicionar alguma descrição / explicação.
Rajen Raiyarela