组文件同等地基于大小为'n'组

时间:2012-12-18 13:37:26

标签: windows cmd

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

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

如何将它们分组到' n'各组的总体规模相似......?

[更新] 例如:我需要向100个人提供1000个文件进行重新编辑。我希望他们每个人都能获得大约相同数量的文本进行编辑。这样没有人太不走运,而另一个人幸运得太少。

2 个答案:

答案 0 :(得分:0)

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

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

for /f "usebackq delims=" %%A in (`dir /b /o:-s /a:-d`) do echo.%%~dpnA = %%~zA

答案 1 :(得分: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要求的) < / p>

使用行号上的modulo(余数)运算符将所有文件分配给组很简单。文件可以简单地按大小排序,但是第一组总是会在 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