
Necesito una secuencia de comandos de archivos por lotes para mover todos los archivos de una única carpeta principal a tantas subcarpetas como sea necesario, siempre que cada subcarpeta reciba la cantidad máxima de archivos especificada en el archivo por lotes o en la línea de comando. En otras palabras, el script debe distribuir todos los archivos de la carpeta principal en varias subcarpetas debajo de ella (que el script debe crear automáticamente), moviendo los archivos en muchas subcarpetas.Xarchivos (donde "X" es la cantidad de archivos que recibirá cada subcarpeta).
Requisitos adicionales:
Los nombres de las subcarpetas deben crearse según la siguiente nomenclatura: 001, 002, 003, etc.
Debe admitir archivos con todo tipo de nombres de archivo (con espacios, con caracteres especiales o acentuación no inglesa, etc.).
Debe soportar el movimiento de decenas de miles de archivos.
Debe funcionar en Windows 10 Professional con derechos de administrador local.
Por ejemplo, digamos que la carpeta "D:\Descargas" tiene 2400 archivos y desea distribuirlos en subcarpetas que contengan hasta 1000 archivos cada una. Después de ejecutar el script, se creará la siguiente estructura:
D:\Downloads
|__001
|__002
|__003
Dónde:
D:\Downloads --> Will have no files inside it anymore
|__001 --> Will have 1000 files inside it
|__002 --> Will have 1000 files inside it
|__003 --> Will have the last 400 files inside it
El orden de los archivos (qué archivo va a qué subcarpeta) no es importante, es decir, el movimiento no necesitará tener en cuenta ningún criterio específico (como nombre de archivo, tamaño, tipo de archivo, etc.). Sin embargo, cualquier mejora en este aspecto será bienvenida (por ejemplo, la opción de mover primero los últimos archivos creados a las primeras subcarpetas).
¿Algunas ideas?
ACTUALIZAR
Aquí está la solución que funcionó para mí:
@echo off
setlocal enableextensions
setlocal enabledelayedexpansion
if not %3.==. goto syntax
if %2.==. goto syntax
:: Checks if %2 is a number:
SET "var="&for /f "delims=0123456789" %%i in ("%2") do set var=%%i
if defined var (goto syntax)
if /i %1.==. goto syntax
if /i not exist %1 echo. & echo The folder %1 does not exist... && echo Folder paths must be typed between "quotes" if there's any empty space. && echo. && goto end
setlocal enableextensions
setlocal enabledelayedexpansion
:: Maximum amount of files per subfolder:
SET limit=%2
:: Initial counter (everytime counter is 1, a new subfolder is created):
SET n=1
:: Subfolder counter:
SET nf=0
::Retrieves the amount of files in the specified folder:
set count=0
for %%A in (%1%\*.*) do set /a count+=1
echo.
echo Distributing %count% files in subfolders of up to %2 files...
FOR %%f IN (%1%\*.*) DO (
:: If counter is 1, create a new subfolder with name starting with "00...":
IF !n!==1 (
SET /A nf+=1
MD %1%\00!nf!
)
:: Move files into subfolders with names starting with "00...":
MOVE /-Y "%%f" %1%\00!nf! > NUL
:: Reset counter when a subfolder reaches the maximum file limit:
IF !n!==!limit! (
SET n=1
) ELSE (
SET /A n+=1
)
)
SET limit=
SET n=
SET nf=
SET count=
echo Move finished successfully.
goto end
:syntax
echo.
echo YOU TYPED: movedown %*
echo SYNTAX: movedown ["full path"] (between quotes if there's any space) [n] (maximum number of files per subfolder)
echo.
:end
ENDLOCAL