将大文件夹分解为具有顺序文件的较小文件夹

Breaking down a large folder into smaller folders with sequential files

我对使用批处理文件还很陌生。我需要将一个包含大约 500k 个图像的文件夹拆分为每个大约 5000 个较小的文件夹。我已经能够做到这一点,但他们没有按顺序分裂。例如,图像 1 将位于一个文件夹中,而图像 2 位于完全不同的文件夹中。这是我目前所拥有的。

@echo off
setlocal enabledelayedexpansion

set source=C:\Desktop\test

set numfiles=0
set numdirs=1
set filelimit=5000

for /F "tokens=*" %%G in ('dir "%source%" /A:-D /B') do (
 set /A numfiles+=1
 set target=0000!numdirs!
 set target=!target:~-5!
 if not exist "%source%\!target!" md "%source%\!target!"
 move "%source%\%%G" "%source%\!target!"

 if [!numfiles!]==[%filelimit%] (
  set /A numdirs+=1
  set numfiles=0
 )
)

文件名示例:

02C_CN201S7P_00001.tif
02C_CN201S7P_00002.tif
02C_CN201S7P_00003.tif

如有任何帮助,我们将不胜感激。

在 FAT16、FAT32 和 exFAT 驱动器上,文件名不像在 NTFS 驱动器上那样按名称排序。因此,建议使用 DIR 选项 /ON 来获取按名称排序的文件名列表。

@echo off
setlocal EnableExtensions EnableDelayedExpansion

set "source=C:\Desktop\test"

set "numfiles=0"
set "numdirs=1"
set "filelimit=5000"

for /F "delims=" %%G in ('dir "%source%" /A:-D /B /ON 2^>nul') do (
    set /A numfiles+=1
    set "target=0000!numdirs!"
    set "target=!target:~-5!"
    if not exist "%source%\!target!" md "%source%\!target!"
    move "%source%\%%G" "%source%\!target!"

    if !numfiles! == %filelimit% (
        set /A numdirs+=1
        set "numfiles=0"
    )
)

DIR 命令行上添加 /ON 是对批处理文件代码所做的唯一修改,与有问题的代码相比,对执行有影响。

将两个数字作为字符串进行比较的两个环境变量引用周围的方括号没有特殊含义,此处不需要,因为两个环境变量始终已定义。因此,从最后一个 IF 条件命令行中删除了四个方括号。