У меня 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
}