大量のファイルプールから特定の数のファイルをフォルダに移動する

大量のファイルプールから特定の数のファイルをフォルダに移動する

1 つのフォルダー (ソース) に 100 万個のファイルがあります。新しいフォルダーを作成し、そこに 5K 個のファイルを移動し、ソース内のすべてのファイルが別の宛先フォルダーに移動されるまでこれを繰り返します。最終結果は、それぞれ 5K 個のファイルを含む 200 個の新しいフォルダーになります。できれば Windows でこれを実行したいと思います。

フォルダー名はランダムに作成でき、ファイルはプールからランダムに選択できます。

更新 1: 結果として得られる 200 個のフォルダーはルートの直下に存在するため、宛先フォルダー構造は必要ありません。

答え1

正確に答えると、これは 5,000 個のファイルをフォルダーに移動し、1移動するファイルがなくなるまで続行します。最後のフォルダーには、おそらく 5,000 個未満のファイルが含まれます。

PowerShell ではテストされていないため、結果は異なる場合があります。

$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 ;
    }
}

これはあなたが尋ねたことと一致しませんその通りただし、この問題に対処する一般的な方法は、ファイル名の最初の文字に基づいて、ファイルをさらに 2 つの深度に分割することです。

これにより、ファイルは均等に分散されませんが、ファイルに GUID の名前が付けられている場合は、各レベルで 256 個のフォルダーの制限があります。

*.pdfPowershell では、から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
}

関連情報