it-swarm-pt.tech

Excluindo arquivos em massa no Windows

Eu tenho um diretório, que contém ~ 3 milhões de arquivos em determinados subdiretórios em um servidor Windows 2008. Excluir manualmente os arquivos via SHIFT + DEL no diretório raiz leva tempo. Existe alguma outra maneira de fazer a exclusão de um mais rápido maneira?

138
aaginor

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

Excluir com o Windows Explorer é um lixo, porque desperdiça muito tempo enumerando os arquivos. Eu geralmente movo as coisas que eu preciso excluir para C:\stufftodelete e tenho um arquivo em lote 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, então quanto mais rápido melhor.

Aqui estão os resultados de um teste Quick Time de uma pequena amostra de 5,85 MB de 960 arquivos em 303 pastas. Eu executei o método 1 seguido pelo método 2 e, em seguida, restaure 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

Método 2 tem uma primeira passagem para excluir arquivos e saídas para nul para evitar a sobrecarga de escrever a tela para cada arquivo singe. Um segundo passe, em seguida, 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 resultado 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

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


Edit: Eu tenho testado 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! Eu vou estar atualizando meu deletestuff.bat!

177
Hugo

Se você precisar excluir árvores de diretórios grandes regularmente, considere armazenar a raiz dessa árvore de diretórios em uma partição separada e, em seguida, simplesmente formate-a rapidamente sempre que precisar excluir tudo. Se você precisar automatizar isso, você pode usar este comando do 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 rótulo. Eu escrevi sobre isso aqui .

18
Mr. Bungle

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

del /f /s /q foldername 
9
lmsasu

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 for copiar/mover/excluir).

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

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

6
rautamiekka

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 dois passos, um, tenta apagar os arquivos. E o segundo é tentar apropriar-se dos arquivos. y deve ser alterado de acordo com o seu local (stand for yes em inglês). Se falhar a tarefa (por exemplo, se falhar porque a permissão), então você deve executá-lo novamente. No entanto, a segunda rodada não tentará excluir os arquivos excluídos na primeira rodada, por isso pode ser bem rápido.


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

 delfolder "foldername"   

onde nome da pasta é o nome da pasta

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

6
magallanes

Use o comando rd/s no comando Prompt.

3
JP Alioto

Usando 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
3
Benoit

A melhor solução prática é provavelmente mover a pasta para fora do caminho em algum lugar (por exemplo, a Lixeira) e, em seguida, começar a excluí-la. Vai demorar muito, mas pelo menos vai ficar 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.

2
Ryan Thompson

Instale Cygwin e use rm -r . Mas é provável que seja um exagero.

1
CarlF

Você tem geração de nome de arquivo curto 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.

1
MSalters

Você já tentou 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, em seguida, 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.

0
Stephen Kellett

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

Os dois métodos acima indicados parecem bastante eficazes, mas determinar o desempenho seria difícil, a menos que sejam colocados em concordância com as mesmas condições exatas:

  • Modelo e Dispositivo de Disco Rígido Físico
    • Preferencialmente, o ATTO/Crystal Disk é comparado antes de clonar os dados neles
  • Mesma localização e geometria da partição/volume
    • A maneira de fazer isso seria desfragmentar a partição de amostra/pastas e cloná-los exatamente como eles são exatamente os mesmos tipos de discos rígidos (da etapa anterior)
  • Em seguida, execute as configurações via Batch File e use o Powershell Cmdlet para registrar e medir seu desempenho.

    • Idealmente, adicione alguns mecanismos para impedir qualquer viés de cache devido à recente atividade semelhante.
  • A seguir estão algumas pastas de amostra (nomeadas como tamanho total) que eu experimentei, mas não consegui obter nenhum desempenho/resultados conclusivos.

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 a tamanhos e distribuição de 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
0
Alex S

A resposta de Hugo é a mais rápida, mas não remove 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 por Magallanes , seja muito cuidadoso com takeown e icacls, pois os hardlinks compartilham as mesmas permissões e proprietários, portanto, se houver hardlinks insaturados na pasta que você deseja remover, usando takeown e icacls irá alterar permissões e proprietários de arquivos fora da pasta.

Usando a ferramenta ln.exe você pode listar todos os arquivos com hardlink dentro da pasta e saber se eles estão com hardlink para arquivos fora da pasta (hardlinks não saturados):

ln.exe --enum foldername > HardlinksList.txt
0
liamZ