2009-08-07 07:00:33 +0000 2009-08-07 07:00:33 +0000
142
142

Eliminação em massa de ficheiros no Windows

Tenho um directório, que contém ~ 3 milhões de ficheiros em certos subdirectórios num servidor Windows 2008. A eliminação manual dos ficheiros através de SHIFT+DEL no dir. raiz demora séculos. Há alguma outra forma de fazer a eliminação de forma mais rápida*?

Respostas (14)

180
180
180
2011-05-27 11:27:41 +0000

AVISO: se tiver links simbólicos para directórios então del apagará os directórios reais e não os links simbólicos. Tenha muito cuidado com isto e não execute estes comandos a menos que saiba que não existem links simbólicos dentro do directório alvo.


Preciso regularmente de apagar muitos ficheiros e directórios de uma unidade encriptada WinXP, normalmente cerca de 22 GB de 500.000 ficheiros em 45.000 pastas.

Apagar com o Windows Explorer é um desperdício porque desperdiça muito tempo a enumerar os ficheiros. Normalmente mudo o material que preciso de apagar para C:\stufftodete e tenho um ficheiro de lote deletestuff.bat para rmdir /s/q C:\stufftodelete. Isto está programado para funcionar à noite, mas às vezes preciso de o executar durante o dia para que quanto mais rápido melhor.

Aqui estão os resultados de um teste de tempo rápido de uma pequena amostra de 5,85 MB de 960 ficheiros em 303 pastas. Executei o método 1 seguido do método 2, depois reiniciei os directórios de teste.

Método 1 remove os ficheiros e a estrutura de directórios numa só passagem:

rmdir /s/q foldername

Método 2 tem uma primeira passagem para eliminar ficheiros e saídas para nul para evitar a sobrecarga de escrita para o ecrã para cada ficheiro de singe. Uma segunda passagem limpa depois a estrutura de directório 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 ficheiros em 3.243 pastas:

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

& Portanto, não há muito nele, provavelmente demasiado perto para julgar num único teste.


Editar: Retestei com muito mais dados, este é um caso típico para mim: 28,3 GB de 1.159.211 ficheiros 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! Estarei a actualizar o meu deletestuff.bat!

18
18
18
2011-10-31 06:37:53 +0000

Se tiver de apagar regularmente grandes árvores de directórios, considere armazenar a raiz dessa árvore de directórios numa partição separada, depois simplesmente formatá-la rapidamente sempre que precisar de apagar tudo. Se precisar de automatizar isto, pode usar este comando DOS:

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

onde Z: é a sua partição ‘volátil’. Nota: a partição não deve ter etiqueta. Eu bloguei sobre esta aqui .

9
9
9
2009-08-07 07:07:04 +0000

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

del /f /s /q foldername
7
7
7
2011-05-25 14:00:51 +0000

Além de copiar/mover ficheiros muito rapidamente (usando o seu próprio API), a TeraCopy pode apagar ficheiros e também é muito rápida. Desde que descobri o TeraCopy não utilizo um computador sem ele instalado (se vou copiar/mover/apagar).

O mesmo instalador instala edição x64 mas para o utilizar é preciso forçá-lo manualmente.

O beta que recomendo sobre as versões estáveis: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/

6
6
6
2012-02-09 17:35:24 +0000

Fiz um ficheiro de morcegos que fazem 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

faz o trabalho em duas etapas, uma, tenta apagar os ficheiros. E a segunda é tentar tomar posse dos ficheiros. y* deve ser mudado de acordo com o seu local (significa “sim” em inglês). Se falhar a tarefa (por exemplo, se falhar por permissão), então deve executá-la novamente. No entanto, a segunda ronda não tentará apagar os ficheiros apagados na primeira ronda, pelo que poderá ser bastante rápida.


Como utilizá-lo. Guardar como delfolder.bat numa rota de caminho (por exemplo c:\janelas), depois executá-lo como

delfolder "foldername"

onde foldername é o nome da pasta

No meu teste, apagar 123'000 ficheiros demorou 3 minutos (sata 7200rpm). YAY!

4
4
4
2011-12-23 15:47:15 +0000

A utilização do código abaixo funciona normalmente bem para mim.

mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe
3
3
3
2009-08-07 07:09:35 +0000

Utilizar o comando rd /s a partir do prompt de comando.

2
2
2
2009-10-06 21:59:15 +0000

A melhor solução prática é provavelmente mover a pasta para fora do caminho para algum lugar (por exemplo, a lixeira) e depois começar a apagá-la. Demorará séculos, mas pelo menos estará fora do caminho.

Tenho quase a certeza que o tempo necessário para apagar todos esses ficheiros é um requisito inerente à tarefa, não uma ineficiência na implementação da eliminação.

1
1
1
2009-10-06 23:45:48 +0000

Instalar Cygwin e usar rm -r. Mas é provável que isso seja um exagero.

1
1
1
2011-05-31 12:40:36 +0000

Tem a geração de nomes de ficheiros curtos activada? Se sim, precisa mesmo dele? A remoção de um ficheiro é apenas uma aparição de metadados. Assim, se tiver o dobro do número de nomes a remover, a quantidade de trabalho é significativamente maior.

0
0
0
2017-12-13 19:46:11 +0000

A resposta de Hugo é a mais rápida mas não remove ficheiros escondidos ou ficheiros do sistema na primeira passagem, por isso se quiser uma solução mais completa utilize o parâmetro /a:

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

Sobre o ficheiro BAT por Magallanes , tenha muito cuidado com o takeown e icacls, pois os hardlinks partilham as mesmas permissões e proprietários, por isso se existirem hardlinks insaturados na pasta que pretende remover, utilizando o takeown e icacls irá alterar as permissões e proprietários de ficheiros fora da pasta.

Usando a ferramenta ln.exe pode listar todos os ficheiros com hardlink dentro da pasta e saber se estão hardlinkados a ficheiros fora da pasta (hardlinks insaturados):

ln.exe --enum foldername > HardlinksList.txt
0
0
0
2010-04-03 16:30:58 +0000

Já experimentou alguma destas duas aplicações? Faça isto clicando nas opções e depois altere o valor na parte inferior do diálogo.

Introduza o caminho a apagar no campo Fonte e depois clique em Apagar.

Estas aplicações não colocam os ficheiros no caixote do lixo da reciclagem. Utilizar com cuidado.

0
0
0
2017-06-15 12:00:52 +0000

Isto é fornecido para elogiar e aumentar as medidas tomadas nas respostas anteriormente mencionadas.

Os dois métodos acima indicados parecem bastante eficazes, mas para determinar o desempenho seria difícil, a menos que fossem colocados contra exactamente as mesmas condições:

  • Dispositivo Físico de Disco Rígido e Modelo
  • De preferência, ATTO/ Disco de Cristal comparado antes de clonar os dados neles
  • Mesma Partição/ Localização de Volume & Geometria
  • A forma de o fazer seria desfragmentar a partição/ pastas de amostra e cloná-las exactamente como são 2 exactamente os mesmos tipos de Discos Rígidos (do passo anterior)
  • Depois executar as configurações via Ficheiro de Lote e usar Powershell Cmdlet para registar e medir o seu desempenho.

  • Seguem-se algumas pastas de amostras (nomeadas como tamanho total) que experimentei mas não consegui obter qualquer desempenho / resultados conclusivos.

r.bat*

rmdir /s/q 3.2G

rd.bat

> del /f/s/q 3.3G > nul
> rmdir /s/q 3.3G
> ``` 
> ```
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
  • Eu teria colocado os ficheiros de registo de saída, mas acredito que a variação é enorme devido aos tamanhos & distribuição de ficheiros de pastas, etc.

Powerershell:

0x1&

-1
-1
-1
2009-08-07 07:13:28 +0000

Eliminar pasta é mais rápido do que eliminar vários ficheiros.

Portanto, se preferir usar o rato em vez de comando, pode criar directório, mover ficheiros para lá e apagá-los (com Shift+Del como disse).