En Batch puedes hacerlo, pero aparte de ser tedioso llevarlo a cabo, un script considerado eficiente que hiciese las verificaciones necesarias probablemente resultaría en un procedimiento muy, muy lento, llegando a superar sin exagerar los 60 minutos o tal vez +90-120, en caso de que realmente sean +9 millones de archivos quizás varias horas (es dificil calcularlo a ojo, es realmente muy lento), por la lógica de filtración de archivos (incrementación, substring/regex, etc). Sin embargo, en otro lenguaje sería una tarea simple y sencilla de agrupación de archivos según "X" condición.
Supongo que el lenguaje te será indiferente ya que solo pareces querer llevar a cabo una tarea administrativa con cualquier herramienta que pueda hacerlo, esté escrita en el lenguaje que esté. Pero antes de empezar y mostrarte el código necesario (en C#/VB.NET, no Batch), para asegurarnos que todo me haya quedado claro por favor muéstrame otro ejemplo real aparte de este:
00361570001.tiff
00361571002.tiff
00361572003.tiff
00361573004.tiff
00361574005.tiff
00361575006.tiff
00361576007.tiff
00361577008.tiff
Ya que, con los datos que has proporcionado, yo supongo que el siguiente grupo a mover sería algo así:
00361580001.tiff
00361581002.tiff
00361582003.tiff
00361583004.tiff
00361584005.tiff
00361585006.tiff
00361586007.tiff
00361587008.tiff
Y el siguiente podría ser este:
00361590001.tiff
00361591002.tiff
00361592003.tiff
00361593004.tiff
00361594005.tiff
00361595006.tiff
00361596007.tiff
00361597008.tiff
Es decir, que el "delimitador" virtual empezaría siempre en esta posición:
00361570001.tiff
*******1002.tiff
*******2003.tiff
*******3004.tiff
*******4005.tiff
*******5006.tiff
*******6007.tiff
*******7008.tiff
00361580001.tiff
*******1002.tiff
*******2003.tiff
*******3004.tiff
*******4005.tiff
*******5006.tiff
*******6007.tiff
*******7008.tiff
00361590001.tiff
*******1002.tiff
*******2003.tiff
*******3004.tiff
*******4005.tiff
*******5006.tiff
*******6007.tiff
*******7008.tiff¿Todo esto que acabo de decir es correcto?.
Saludos