Exclusão em massa de arquivos no Windows

141

Eu tenho um diretório que contém ~ 3 milhões de arquivos em determinados subdiretórios em um servidor Windows 2008. A exclusão manual dos arquivos via SHIFT + DEL no diretório raiz leva séculos. Existe alguma outra maneira de fazer a exclusão de maneira mais rápida ?

Cfinley
fonte
1
Também perguntado aqui no estouro de pilha: stackoverflow.com/questions/186737/… #
Hugo Hugo
6
Como eu poderia direcionar o ímã apenas para alguns subdiretórios?
Jaime Hablutzel
7
@Jaime Com mão firme, como um verdadeiro programador ... ;-) xkcd.com/378
Legionair
E se for uma unidade SSD?
Benjamin Weiss
Resposta para powershell: stackoverflow.com/questions/1752677/…
Warlike Chimpanzee

Respostas:

179

AVISO: se você tiver links simbólicos para diretórios, delos diretórios reais serão excluídos e não os links simbólicos. Tenha muito cuidado com isso e não execute esses comandos, a menos que saiba que não há links simbólicos no diretório de destino.


Eu regularmente preciso excluir muitos arquivos e diretórios de uma unidade criptografada WinXP, geralmente cerca de 22 GB de 500.000 arquivos em 45.000 pastas.

Excluir com o Windows Explorer é um lixo, pois gasta muito tempo enumerando os arquivos. Normalmente, movo as coisas que preciso excluir para C: \ stufftodelete e tenho um arquivo em lotes deletestuff.bat para rmdir /s/q C:\stufftodelete. Isso está programado para ser executado à noite, mas às vezes eu preciso executá-lo durante o dia para que quanto mais rápido, melhor.

Aqui estão os resultados de um teste rápido de uma pequena amostra de 5,85 MB de 960 arquivos em 303 pastas. Executei o método 1 seguido pelo método 2 e redefini os diretórios de teste.

O método 1 remove os arquivos e a estrutura de diretórios em uma passagem:

rmdir /s/q foldername

O método 2 tem uma primeira passagem para excluir arquivos e saídas para nul para evitar a sobrecarga de gravar na tela para cada arquivo de singe. Uma segunda passagem limpa a estrutura de diretórios restante:

del /f/s/q foldername > nul
rmdir /s/q foldername
  • Método 1: 17,5s, 14,9s, 13,9s, 14,8s, 13,8s: média 14,98 segundos
  • Método 2: 14.3s, 12.1s, 11.7s, 14.2s, 11.8s: média 12.82 segundos

Aqui estão os resultados de outro teste usando 404 MB de 19.521 arquivos em 3.243 pastas:

  • Método 1: 2 minutos e 20 segundos
  • Método 2: 2 minutos 33 segundos

Portanto, não há muito, provavelmente perto demais para julgar em um único teste.


Edit: Testei novamente com muito mais dados; este é um caso típico para mim: 28,3 GB de 1.159.211 arquivos em 146.918 pastas:

  • Método 1: 2h 15m, 2h 34m: média: 2 horas 25 minutos
  • Método 2: 49m, 57m: média: 53 minutos

Uau, o método 2 é quase três vezes mais rápido que o método 1! Vou atualizar meu deletestuff.bat!

Hugo
fonte
RD / S / Q funciona muito bem se você especificar um caminho absoluto, mas não ao trabalhar com caminhos relativos. Há uma solução?
Michael S.
1
@ Hugo: Hugo, uma pergunta: Nos testes cronometrados acima, para um ou ambos os métodos, você contou os arquivos imediatamente antes de executar o método? Estou perguntando porque o conteúdo da pasta já pode estar no cache de arquivos do SO. Obrigado!
William C
@ WilliamiamC: Não me lembro exatamente, mas, para as exclusões repetidas com o mesmo conteúdo, contarei imediatamente antes de apenas uma exclusão e não a repetirei para as outras exclusões (como eu já sabia os números).
Hugo
1
O rmdir e o del falham quando há nomes de caminho com mais de 256 caracteres envolvidos.
Nicolai Ehemann
1
AVISO: se você tiver links simbólicos para diretórios, delos diretórios reais serão excluídos e não os links simbólicos. Tenha muito cuidado com isso e não execute esses comandos, a menos que saiba que não há links simbólicos no diretório de destino.
user0103 19/09
18

Se você precisar excluir grandes árvores de diretório regularmente, considere armazenar a raiz dessa árvore em uma partição separada e simplesmente formate-a rapidamente sempre que precisar excluir tudo. Se você precisar automatizar isso, poderá usar este comando do DOS:

echo Y | format Z: /FS:NTFS /X /Q

onde Z: é sua partição 'volátil'. Nota: a partição não deve ter rótulo. Eu escrevi sobre isso aqui .

Mr. Bungle
fonte
E use um hardlink para criar conexão entre o disco e o diretório onde os arquivos são armazenados, se for necessário o caminho exato do diretório.
Nime Cloud
1
@NimeCloud: Hardlinks não podem cruzar sistemas de arquivos ou diretórios de links.
grawity
5
No entanto, links simbólicos podem cruzar sistemas de arquivos e diretórios de links, portanto, podem ser apropriados aqui. Veja o comando mklink (Vista e, mais tarde, caso contrário use junção de Mark Russinovich / SysInternals.)
Robert Calhoun
9

No prompt de comando (Iniciar -> Executar -> cmd):

del /f /s /q foldername 
lmsasu
fonte
Isso é ótimo porque lista o que está excluindo .. mas é o mesmo que rd em termos de velocidade.
bobobobo
1
Oh woah woah woah. Não é tão bom quanto eu pensava. Exclui os arquivos rapidamente, mas deixa intacta a árvore de diretórios.
bobobobo
1
O que devo acrescentar leva muito tempo para limpar usando rd.
bobobobo
3
@bobobobo Eu fiz alguns testes com ~ 30GB / 1.000.000 de arquivos / 15.000 pastas e o del + rd é quase três vezes mais rápido do que apenas rd: superuser.com/questions/19762/mass-deleting-files-in-windows/…
Hugo
1
Isso falhará se o nome do caminho for maior que 256 caracteres.
Nicolai Ehemann
7

Além de copiar / mover arquivos muito rapidamente (usando sua própria API), o TeraCopy pode excluir arquivos e é muito rápido também. Desde que descobri o TeraCopy, não uso um computador sem ele instalado (se vou copiar / mover / excluir).

O mesmo instalador instala a edição x64, mas para usá-lo, você deve forçá-lo manualmente.

A versão beta que recomendo nas versões estáveis: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/

rautamiekka
fonte
Você já fez ou viu algumas comparações de tempo com TeraCopy vs rmdir ou del ou del + rmdir?
Hugo
1
@ Hugo: Pergunta estúpida. Eu não recomendaria o TeraCopy se não fosse visível a olho nu, é mais rápido!
rautamiekka
5
Então você calcula que é 10% mais rápido? Duas vezes mais rápido? Dez vezes mais rápido? Um milhão de vezes mais rápido? Seria ótimo se você pudesse compará-lo ao rmdir com dois conjuntos de testes grandes e idênticos.
23711 Hugo
1
Obrigado! Uso o TeraCopy há anos, mas nunca soube da função de exclusão em massa. E você está certo, é muito, muito mais rápido!
AzDayton 23/05
1
@Amalgovinus Você não. Você abre o programa e adiciona arquivos / pastas com o recurso arrastar e soltar ou clicar com o botão direito do mouse ou clicar com o botão direito do mouse em seus arquivos / pastas no Explorer / na área de trabalho. Quando terminar de percorrê-los, basta clicar em 'Excluir' e 'Mover para a Lixeira', se desejar, mas eu sou a favor de 'Excluir do disco'. No entanto, você precisará inicializar o TeraCopy como Admin para que ele seja exibido na área de trabalho / Explorer, clique com o botão direito do mouse se isso não for feito por padrão.
rautamiekka 6/06
6

Eu fiz um arquivo bat que faz o mesmo.

@echo off
echo --------------------WARNING--------------------
echo folder "%~1" will be deleted
echo --------------------WARNING--------------------
pause
echo Deleting folder: "%~1".
time /T
del /f/s/q "%~1" >nul
rmdir /s/q "%~1" >nul
echo Done.
time /T
echo --- Taking ownership.
takeown /f "%~1" /r /d y >nul
icacls "%~1" /reset /t >nul
icacls "%~1" /setowner "%username%" /t >nul
echo Done all.
time /T

ele faz o trabalho em duas etapas, uma, tenta excluir os arquivos. E o segundo é tentar se apropriar dos arquivos. y deve ser alterado de acordo com o seu local (defina yes em inglês). Se a tarefa falhar (por exemplo, se falhar porque a permissão), você deverá executá-la novamente. No entanto, a segunda rodada não tentará excluir os arquivos excluídos na primeira rodada, portanto pode ser bem rápido.


Como usá-lo. Salve como delfolder.bat em uma rota de caminho (por exemplo, c: \ windows) e execute-a como

 delfolder "foldername"   

onde foldername é o nome da pasta

No meu teste, a exclusão de 123'000 arquivos levou 3 minutos (sata 7200rpm). YAY!

Magallanes
fonte
1
Normalmente você não deve usar %1um script, mas "%~1". Dessa forma, se o argumento tiver sido passado com aspas, ele será cotado e requoted. Se não foi passado entre aspas, é citado.
Benoit
4

Usar o código abaixo geralmente funciona bem para mim.

mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe
Benoit
fonte
Adicione um `> nul` ao final da chamada de robocópia para que você não precise vê-la na tela.
18713 JoshDM
É semelhante ao uso rsyncno Linux. Está aqui mais rápido ainda rmdir?
Hastur 24/03
Para sua informação, essa robocópia é muito diferente de del /f/q/s+ rmdir /s/q. Se o seu dir_to_wipe tiver junktions, c:\some_important_dirvocê acabará perdendo seus dados.
Pavel P
@Pavel usa / XJ para excluir pontos de junção e links simbólicos?
Bernhard
Isso fez o truque para um diretório de ~ 36GB que tinha centenas de diretórios e arquivos com mais de 256 caracteres, causando uma falha grave no "método" del / rmdir. Isso levou alguns segundos, o Windows Explorer estava estimando HORAS!
3

Use o comando rd / s no prompt de comando.

JP Alioto
fonte
2
Não. Isso é tão lento quanto excluir do explorer.
bobobobo
Bem, está tudo bem. Funciona melhor que del / f / s / q, de qualquer maneira.
bobobobo
3
Bem, isso é MUITO melhor do que usar o Explorer para excluir, na verdade. Ele continua a excluir, mesmo se a eliminar ou dois irá falhar (onde explorador engasga e aborta)
bobobobo
2

A melhor solução prática é provavelmente mover a pasta para outro lugar (por exemplo, a Lixeira) e começar a excluí-la. Vai levar séculos, mas pelo menos estará fora do caminho.

Tenho certeza de que o tempo necessário para excluir todos esses arquivos é um requisito inerente da tarefa, não uma ineficiência na implementação da exclusão.

Ryan Thompson
fonte
1

Instale o Cygwin e use rm -r . Mas isso provavelmente será um exagero.

CarlF
fonte
Isso é exatamente o mesmo que rd /q /s...
Joey
Muita tarefa e velocidade quase equivalente!
adeelx
1
Não é pior do que as várias outras respostas install-tool-X-and-use-it aqui e não devem ser rejeitadas se não estiverem sendo feitas.
JdeBP
2
O cygwin é rmrealmente tão rápido quanto o cmd.exe rd? Como a emulação cygwin da interface posix é bastante lenta, pois requer um trabalho extra, isso rmnão é realmente bom.
Jan Hudec
Enquanto esperava uma grande coleção de arquivos para excluir, tive tempo suficiente para instalar o Cygwin e tentar rm -rf. Eu abortei cerca de 10 minutos e retornei del /f/s/qporque, sob Cygwin, o uso do disco era de apenas 50%. Abaixo del, o uso do disco é indexado a 100%. Então, acho que deve ser excluído mais rapidamente. O uso da CPU é <1% para ambos os métodos. Não tenho certeza do número do arquivo, porque fechei o Deleter de Arquivo do Windows depois de dez minutos calculando.
Derek Ziemba
1

Você tem a geração curta de nome de arquivo ativada? Se sim, você realmente precisa disso? A remoção de um arquivo é apenas uma operação de metadados. Portanto, se você tiver o dobro do número de nomes a remover, a quantidade de trabalho será significativamente maior.

MSalters
fonte
0

Você já experimentou um desses dois aplicativos?

Certifique-se de definir o número de substituições como 0 se desejar um desempenho mais rápido. Faça isso clicando em opções e altere o valor na parte inferior da caixa de diálogo.

Digite o caminho para excluir no campo Origem e clique em Excluir.

Esses aplicativos não colocam os arquivos na lixeira. Use com cuidado.

Stephen Kellett
fonte
0

Isso é fornecido para complementar e aumentar as etapas das respostas mencionadas anteriormente.

Os dois métodos indicados acima parecem bastante eficazes, mas determinar o desempenho seria difícil, a menos que sejam ajustados exatamente nas mesmas condições:

  • Modelo e dispositivo de disco rígido físico
    • De preferência, o ATTO / Crystal Disk é comparado antes de clonar os dados neles
  • Mesma partição / volume, localização e geometria
    • A maneira de fazer isso seria desfragmentar as partições / pastas de amostra e cloná-las exatamente como são 2 exatamente os mesmos tipos de discos rígidos (da etapa anterior)
  • Em seguida, execute as configurações por meio de Arquivo em Lote e use o Powershell Cmdlet para registrar e medir seu desempenho.

    • Idealmente, adicione alguns mecanismos para evitar vieses de armazenamento em cache devido a novas atividades semelhantes.
  • A seguir, estão algumas pastas de amostra (nomeadas como tamanho total) que eu experimentei, mas não consegui obter nenhum desempenho / resultado conclusivo.

r.bat

rmdir /s/q 3.2G

rd.bat

del /f/s/q 3.3G > nul
rmdir /s/q 3.3G
  • Eu teria postado os arquivos de log de saída, mas acredito que a variação é enorme devido ao tamanho e distribuição dos arquivos de pastas etc.

Powershell:

PS S:\T> Measure-Command { S:\T\rd.bat } > rdlog.txt

PS S:\T> Measure-Command { S:\T\r.bat } > rlog.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_1.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_1.8G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_2.4G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_2.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_3.2G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_3.3G_log.txt
Alex S
fonte
falha com nomes> 256 caracteres
0

A resposta de Hugo é a mais rápida, mas não remove os arquivos ocultos ou do sistema na primeira passagem; portanto, se você quiser uma solução mais completa, use o parâmetro / a:

del /f /s /q /a foldername > nul
rmdir /s /q foldername

Sobre o arquivo BAT de Magallanes , tenha muito cuidado com takeown e icacls, porque os hardlinks compartilham as mesmas permissões e proprietários; portanto, se houver hardlinks não saturados na pasta que você deseja remover, usar takeown e icacls alterará as permissões e os proprietários de arquivos externos a pasta.

Usando a ferramenta ln.exe, você pode listar todos os arquivos vinculados na pasta e saber se eles estão vinculados a arquivos fora da pasta (links não saturados):

ln.exe --enum foldername > HardlinksList.txt
liamZ
fonte
-1

A exclusão da pasta é mais rápida do que a exclusão de vários arquivos.

Portanto, se você preferir usar o mouse em vez do prompt de comando, poderá criar um diretório, mover os arquivos para lá e excluí-lo (com Shift + Del como você disse).

danijelk
fonte
2
O diretório deve ser criado na mesma partição em que os arquivos residem. Isso tornará a ação de movimento instantânea. Se a nova pasta e os arquivos estiverem em partições separadas, toda a operação de cópia durará muito.
5
De onde você tira a idéia de que excluir uma pasta é mais rápido do que excluir os arquivos contidos nela? A exclusão de uma pasta contém como seu primeiro passo para apagar todos os arquivos em que pasta, por isso não pode ser mais rápido. A mudança para a lixeira é uma questão totalmente diferente, mas essa não é a questão aqui.
7289 Joey