0

我正在使用以下命令根据名称生成文件列表...

dir [folder_location] /b >[output_file_name.txt]

如何将它们分组为“n”组,以使每个组的总大小相似......?

[更新]例如:有 1000 个文件我必须给 100 个人重新编辑。我希望他们每个人都能获得大约相同数量的文本进行编辑。这样,没有人倒霉的太多,而另一个幸运的人太少。

4

2 回答 2

0

查看 的/o:s选项dir。要将文件组合在一起,您必须使用for /f循环对信息进行一些解析,使用 检查文件的大小输出%%~zA,并在该点创建分色。

这是一个示例,它将输出filepath = size,不包括目录,并从大到小排序。

for /f "usebackq delims=" %%A in (`dir /b /o:-s /a:-d`) do echo.%%~dpnA = %%~zA
于 2012-12-18T21:35:31.567 回答
0

第一次尝试按大小范围对文件进行分组
(事实证明这不是 OP 想要的)

这是一种方法。您可以根据需要调整组定义。重要的是,组限制按数字降序排列,最后一组必须为 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 组
(这是 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
于 2012-12-18T21:42:12.450 回答