Como mover ou excluir arquivos de uma pasta contendo 2 milhões de arquivos em uma unidade NTFS?

3

O problema é que qualquer modificação no diretório trava o Explorer indefinidamente, embora o acesso do Samba a outros diretórios ainda funcione. Eu tentei mover arquivos localmente e pelo Samba.

Mesmo enumerar o diretório para obter a lista de arquivos bloqueia o computador indefinidamente.

Eu tentei usar win32file.FindFilesIterator do Python para iterar os arquivos, mas isso também trava.

Minha idéia era mover cada arquivo para um diretório diferente (em um diretório acima do diretório com o qual estamos lidando) baseado no timestamp, para que tivéssemos no máximo mil arquivos em cada diretório. Mas desde que eu não posso nem enumerar os arquivos, tem sido um não-iniciante.

Se eu tiver que desistir e apenas ativar o diretório, estou disposto a fazer isso, mas uma exclusão padrão também é interrompida indefinidamente.

Eu configurei esses dois parâmetros para aumentar a velocidade e eles também não ajudaram no problema:

R:\>fsutil behavior query disablelastaccess
disablelastaccess = 1

R:\>fsutil behavior query disable8dot3
disable8dot3 = 1

Estas são todas as imagens sequenciais que teriam corrido para o 'bug' com nomes de arquivos 8.3, segundo o qual muitos arquivos com nomes semelhantes em um diretório podem levar muito tempo para computar nomes de arquivos 8.3. Pelo que entendi, esses dados são armazenados no sistema de arquivos, mesmo depois que o disable8dot3 é ativado, portanto, ele ainda pode estar contribuindo para o problema.

Alguma idéia?

    
por Beau 03.02.2010 / 19:22

8 respostas

1

Dependendo de como os arquivos foram adicionados e de quão mal a pasta está fragmentada, a maneira mais rápida pode ser mover os arquivos que você deseja manter e eliminar a partição!

    
por 04.02.2010 / 13:04
4

Eu não sei se vai funcionar, nem se é abordagem prática para você, mas que tal colocar o disco rígido em um computador Linux e experimentá-lo com o Linux?

(Há CDs ativos inicializáveis para download - você não precisa nem mover fisicamente o disco rígido).

    
por 03.02.2010 / 19:36
1

Duas coisas que você não deve fazer:

  1. Coloque tantos arquivos em uma pasta
  2. Use o Windows Explorer para visualizar essa pasta, e muito menos tente fazer qualquer coisa com ela.

O que está acontecendo é que o Explorer está acessando todos e cada um desses arquivos para obter informações que serão ou poderão ser exibidas na interface do Explorer. Além disso, se você tiver um antivírus de acesso em andamento (e, em caso negativo, por que não), cada arquivo será verificado, mesmo que seja apenas para determinar se é ou não um dos tipos que devem ser verificados. Tudo isso leva muito tempo ao lidar com tantos arquivos.

Solução de curto prazo - use a linha de comando ou alguma forma de script.

Solução de longo prazo - Desenvolva um esquema sensato para garantir que você nunca tenha mais do que alguns milhares de arquivos em qualquer pasta.

    
por 04.02.2010 / 04:56
1

You could learn a little ahk or php. ahk would be easier to learn and someone on http://webchat.freenode.net/?channels=#ahk will probably be willing to help you get something together.

quick ex. from when I needed to do this...
Loop, C:\Users\PC\Web Sites\Folderwithtomanyfiles\*.htm, , 1  ; Recurse into subfolders.
{
Match :=
Match1 :=
name :=
name1 :=
M :=
File :=
total++
;the names of my files were each 7digits with some extra info I didn't want to share here so... 
RegExMatch(A_LoopFileFullPath, "Folderwithtomanyfiles\(\d{7}.*?htm)", name)
RegExMatch(A_LoopFileFullPath, "Folderwithtomanyfiles\(\d{7})", Match)
StringTrimLeft, Ma, Match1, 6
M .= Ma . "\"
StringTrimLeft, Ma, Match1, 5
M .= Ma . "\"
StringTrimLeft, Ma, Match1, 4
M .= Ma . "\"
StringTrimLeft, Ma, Match1, 3
M .= Ma . "\"
StringTrimLeft, Ma, Match1, 2
M .= Ma . "\"
StringTrimLeft, Ma, Match1, 1
M .= Ma
FileCreateDir, C:\Users\PC\Web Sites\fewer file names\%M%
FileAppend, %File%, C:\Users\PC\Web Sites\fewer file names\%M%\%name1%
created++
}
MsgBox Created %created% out of %total% 
}
;example of path ... 
;"C:\Users\PC\Web Sites\fewer file names333233523335233.htm
;turns out I should have put a few thousand files in each folder but oh well, hope the example helps. 
    
por 02.01.2011 / 20:11
0

Tente usar o PowerShell. Usando o cmdlet Move-Item

HTH

    
por 03.02.2010 / 19:45
0

Há sempre cmd.exe e seu comando del .

    
por 03.02.2010 / 19:58
0

Você precisará reinicializar para que as alterações do FSUTIL entrem em vigor, caso você não tenha feito isso.

A ordem geral de complexidade para funções NTFS (Add, Delete, Search) com nomes 8.3 desabilitados é O (Log N) então praticamente qualquer coisa que você fizer terá o mesmo período de tempo quando as coisas chegarem a este estado .

Se você tem algum AV ativo no sistema, desligue-o enquanto você corrige isso.

Por curiosidade, você obtém melhor desempenho se copia arquivos em partes usando algo como Robocopy? Eu suspeito que não vai fazer muita diferença, mas deve levar metade do tempo que uma exclusão leva (há apenas uma pesquisa no diretório envolvido não uma pesquisa, em seguida, uma exclusão da entrada). Você ainda terá o problema de excluir os originais eventualmente.

    
por 03.02.2010 / 20:47
0

use o robocopy com a opção / mov

link

Por exemplo, eu tinha uma pasta com arquivos de e-mail de 1,2 m, que pendurava o explorador. Os arquivos foram nomeados a partir da data, então criei pastas para cada mês do ano e, em seguida, usei a filtragem de robocopy na data dos nomes dos arquivos.

robocopy e: \ sent-old \ e: \ sentmail \ 2013-4 201304 *. * / mov

    
por 11.06.2014 / 20:51