ファイルをサイズ範囲でグループ化する最初の試み
(これは OP が望んでいたものではないことが判明しました)
ここに1つの方法があります。必要に応じてグループ定義を調整できます。グループ制限が降順でリストされていることが重要であり、最後のグループは 0 でなければなりません。
@echo off
setlocal
set "folder=test"
set "out=fileGroups.txt"
(
pushd "%folder%"
for /f "eol=: delims=" %%F in ('dir /b /a-d /os "*"') do (
set "class="
for %%A in (
"100000 [>= 100,000] "
"10000 [10,000 - 99,999] "
"1000 [1,000 - 9,999] "
"100 [100 - 999] "
"0 [< 100] "
) do for /f "tokens=1*" %%B in (%%A) do (
if not defined class if %%~zF geq %%B (
echo %%C %%~nxF
set class=1
)
)
)
popd
)>"%out%"
type "%out%"
ファイルをほぼ等しい合計ファイル長の n グループに分割する 2 回目の試行
(これは OP が求めているものです)
行番号でモジュロ (剰余) 演算子を使用して、すべてのファイルをグループに割り当てるのは簡単です。ファイルは単純にサイズで並べ替えることができますが、最初のグループは常にnのグループの中で最小のファイルを取得し、最後のグループは最大のファイルを取得します。グループは公平ではありません。
ファイルサイズのランダムな分布があると仮定すると、 nの特定のグループについて、どのグループが最小および最大になるかをローテーションすることが求められます。解決策は、少し数学を使えば驚くほど簡単です。
次のコードは、1 ~ 25 の番号を 5 つの異なるグループのいずれかに割り当て、その番号をグループ ファイルに書き込みます。各グループの合計は 65 です。
@echo off
setlocal enableDelayedExpansion
del group*.txt
for /l %%N in (1 1 25) do (
set /a "group=((%%N-1)+(%%N-1)/5)%%5+1"
echo %%N >>group!group!.txt
)
最終的な答えは、サイズでソートされたファイルのリストに上記を適用するだけです。名前は FINDSTR を介してパイプ処理され、各ファイルに「行番号」が割り当てられます。リストはファイルサイズでソートされるため、「行番号」はファイルサイズと同じようにソートされます。
@echo off
setlocal disableDelayedExpansion
set "inFolder=test"
set "outFolder=groups"
set "groups=5"
pushd "%inFolder%"
2>nul del "%outFolder%\group*.txt"
for /f "tokens=1* delims=:" %%A in ('dir /b /a-d /os "*"^|findstr /n "^"') do (
set "file=%%B"
set /a "group=((%%A-1)+(%%A-1)/groups)%%groups+1"
setlocal enableDelayedExpansion
>>"!outFolder!\group!group!.txt" echo !file!
endlocal
)
popd