Ich habe 1 Million Dateien in einem einzigen Ordner (Quelle). Ich möchte einen neuen Ordner erstellen, 5.000 Dateien hinein verschieben und dies wiederholen, bis alle Dateien in der Quelle in separate Zielordner verschoben sind. Das Endergebnis wären 200 neue Ordner mit jeweils 5.000 Dateien. Ich möchte dies vorzugsweise unter Windows tun.
Die Ordnernamen können beliebig erstellt und die Dateien zufällig aus dem Pool ausgewählt werden.
Update 1: Die resultierenden 200 Ordner befinden sich direkt unter dem Stammverzeichnis, sodass keine Zielordnerstruktur erforderlich ist.
Antwort1
Um genau zu beantworten, was Sie wollen: Dadurch werden 5.000 Dateien in Ordner verschoben, beginnend mit 1
und so lange, bis keine Dateien mehr zu verschieben sind. Ihr letzter Ordner wird höchstwahrscheinlich weniger als 5.000 Dateien enthalten.
In Powershell ungetestet, also Ihre Abweichung kann abweichen.
$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 ;
}
}
Das entspricht nicht Ihrer Fragegenau, aber eine übliche Methode, mit diesem Problem umzugehen, besteht darin, die Dateien basierend auf den ersten Zeichen im Dateinamen in zwei weitere Tiefen aufzuteilen.
Dadurch werden die Dateien nicht gleichmäßig verteilt, aber wenn die Dateien mit GUIDs benannt sind, besteht auf jeder Ebene ein Limit von 256 Ordnern.
*.pdf
Um in Powershell von c:\temp
nach zu sortieren 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
}