Назад | Перейти на главную страницу

Перемещение определенного количества файлов в папки из большого пула файлов

У меня 1 миллион файлов в одной папке (источник). Я хочу создать новую папку, переместить в нее файлы размером 5 КБ и повторять, пока все файлы в источнике не будут перемещены в отдельные папки назначения. Конечным результатом будет 200 новых папок по 5К файлов в каждой. Я хочу сделать это предпочтительно в Windows.

Имена папок могут быть созданы случайным образом, файлы могут быть случайным образом выбраны из пула.

Обновление 1: полученные 200 папок будут находиться непосредственно под корневым каталогом, поэтому структура папок назначения не требуется.

Чтобы точно ответить, что вы хотите, это переместит 5000 файлов в папки, начиная с 1 и продолжайте, пока не закончатся файлы для перемещения. В вашей последней папке, скорее всего, будет менее 5000 файлов.

В PowerShell, непроверенный, поэтому 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 ;
    }
}

Это не соответствует тому, что вы просили именно, но распространенный способ решения этой проблемы - разбить файлы еще на две части на основе первых символов имени файла.

Это не распределяет файлы равномерно, но если файлы названы с помощью идентификаторов GUID, у вас будет ограничение в 256 папок на каждом уровне.

В Powershell, чтобы разобраться *.pdf из c:\temp к 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
}