使用顺序文件将大文件夹分解为较小的文件夹

时间:2018-02-21 17:31:50

标签: batch-file directory sequential

我很擅长使用批处理文件。我需要将大约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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

在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 条件命令行中删除了四个方括号。