Tenho 1 milhão de arquivos em uma única pasta (fonte). Quero criar uma nova pasta, mover arquivos de 5K para ela e repetir até que todos os arquivos de origem sejam movidos para pastas de destino separadas. O resultado final seriam 200 novas pastas com 5K arquivos cada. Quero fazer isso no Windows de preferência.
Os nomes das pastas podem ser criados aleatoriamente, os arquivos podem ser escolhidos aleatoriamente no pool.
Atualização 1: As 200 pastas resultantes ficarão diretamente na raiz, portanto, nenhuma estrutura de pasta de destino é necessária.
Responder1
Para responder exatamente ao que você deseja, isso moverá 5.000 arquivos para pastas, começando 1
e continuando até ficar sem arquivos para mover. Sua última pasta provavelmente terá menos de 5.000 arquivos.
No PowerShell, não testado, então YMMV.
$filesperfolder = 5000
$sourcePath = "C:\Temp"
$destPath = "C:\Temp\Sorted"
$i = 0;
$folderNum = 1;
Get-ChildItem "$sourcePath\*.pdf" | % {
New-Item -Path ($destPath + "\" + $folderNum) -Type Directory -Force
Move-Item $_ ($destPath + "\" + $folderNum);
$i++;
if ($i -eq $filesperfolder){
$folderNum++;
$i = 0 ;
}
}
Isso não está de acordo com o que você perguntouexatamente, mas uma maneira comum de lidar com esse problema é dividir os arquivos em mais duas profundidades, com base nos primeiros caracteres do nome do arquivo.
Isso não distribui os arquivos uniformemente, mas se os arquivos forem nomeados com GUIDs, você terá um limite de 256 pastas em cada nível.
No Powershell, para classificar *.pdf
de c:\temp
para c:\temp\sorted
:
$sourcePath = "C:\Temp"
$destPath = "C:\Temp\Sorted"
Get-ChildItem "$folderPath\*.PDF" | %{
$newFolder = $destPath + ("\" + $_.Name.SubString(0,2) + "\" + $_.Name.SubString(3,2)).ToUpper();
New-Item -Path $newFolder -Type Directory -Force
Move-Item $_ $newFolder
}