У меня 1 миллион файлов в одной папке (источник). Я хочу создать новую папку, переместить в нее 5 тыс. файлов и повторять, пока все файлы в источнике не будут перемещены в отдельные папки назначения. Конечным результатом будет 200 новых папок с 5 тыс. файлов в каждой. Я хочу сделать это предпочтительно в Windows.
Имена папок могут быть созданы случайным образом, файлы могут быть выбраны случайным образом из пула.
Обновление 1: полученные 200 папок будут располагаться непосредственно в корневом каталоге, поэтому структура папок назначения не требуется.
решение1
Чтобы ответить на то, что вы хотите, это переместит 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
}