Mover una cantidad específica de archivos a carpetas desde un gran grupo de archivos

Mover una cantidad específica de archivos a carpetas desde un gran grupo de archivos

Tengo 1 millón de archivos en una sola carpeta (fuente). Quiero crear una nueva carpeta, mover archivos de 5K a ella y repetir hasta que todos los archivos del origen se muevan a carpetas de destino separadas. El resultado final serían 200 carpetas nuevas con archivos de 5K cada una. Preferiblemente quiero hacer esto en Windows.

Los nombres de las carpetas se pueden crear aleatoriamente, los archivos se pueden seleccionar aleatoriamente del grupo.

Actualización 1: Las 200 carpetas resultantes residirán directamente en la raíz, por lo que no se necesita ninguna estructura de carpetas de destino.

Respuesta1

Para responder exactamente a lo que desea, esto moverá 5000 archivos a carpetas, comenzando 1y continuando hasta que se quede sin archivos para mover. Lo más probable es que su última carpeta tenga menos de 5000 archivos.

En powershell, no probado, entonces 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 ;
    }
}

Esto no se ajusta a lo que has preguntado.exactamente, pero una forma común de solucionar este problema es dividir los archivos en dos profundidades más, según los primeros caracteres del nombre del archivo.

Esto no distribuye los archivos de manera uniforme, pero si los archivos tienen nombres GUID, tendrá un límite de 256 carpetas en cada nivel.

En Powershell, para ordenar *.pdfdesde c:\temphasta 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
}

información relacionada