secuencia de comandos por lotes para mover x número de archivos a carpetas vacías

secuencia de comandos por lotes para mover x número de archivos a carpetas vacías

Soy nuevo en los scripts por lotes y estoy buscando un script que pueda hacer lo siguiente:

Tengo una gran cantidad de archivos, más de 150000,
estos 150000 archivos están en dir/dir_main.
Quiero ejecutar un script por lotes, desde Windows cmd, de modo que haga lo siguiente


mover 100 archivos a la vez, no importa cuáles, a cada subdirectorio


dir/dir_principal/subdir1
dir/dir_principal/subdir2
dir/dir_principal/subdir3
.
.
.
dir/dir_main/subdir#


nota la palabramover no copiar.


Encontré el siguiente script, que mueve todo:

@ECHO OFF

SET "source=C:\Users\msalehi\Documents\row-columnn fix\test_move\olddir"
SET "dest=C:\Users\msalehi\Documents\row-columnn fix\test_move\newdir"
SET "FileList=file1.txt file2.txt file8.txt" 

SET "dupCnt=1"

FOR /R "%source%" %%A IN (%FileList%) DO (
    IF NOT EXIST "%dest%\%%~NXA" (
        XCOPY /F /Y "%%~FA" "%dest%\" && IF EXIST "%%~FA" DEL /Q /F "%%~FA"
    ) ELSE (
        CALL :DupeRoutine "%%~FA" "%%~NA" "%%~XA"
        )
    )
GOTO :EOF

:DupeRoutine
IF EXIST "%dest%\%~2_(%dupCnt%)%~3" (
    SET /A dupCnt=%dupCnt%+1
    CALL :DupeRoutine "%~1" "%~2" "%~3"
) ELSE (
    IF NOT EXIST "%dest%\%~2_(%dupCnt%)%~3" ECHO F | XCOPY /Y /F "%~1" "%dest%\%~2_(%dupCnt%)%~3" && DEL /Q /F "%~1"
    SET "dupCnt=1" 
    )
GOTO :EOF

no me sirve.

No busco ejecutar esto a través de otro shell, Linux, etc.

Necesito ejecutar un archivo por lotes a través de Windows cmd.

Respuesta1

Algo como esto podría funcionar.

@echo off
set /a counter=1
set /a filesperfolder=100
cd dir\dir_main

:loopstart
set dirname=subdir%counter%
md %dirname%
echo %dirname%

dir /b | findstr /v /i "subdir*"> %temp%\temp.txt && for /l %%l in (1,1,%filesperfolder%) do @for /f "tokens=1,2* delims=:" %%a in ('findstr /n /r "^" %temp%\temp.txt ^| findstr /r "^%%l:"') do @move %%b %dirname%\%%b >nul

set /a counter=%counter%+1
for /f "tokens=*" %%a in ('type %temp%\temp.txt ^| find /c /v ""') do set _filesmoved=%%a
del %temp%\temp.txt
IF %_filesmoved% LSS 100 goto done

goto loopstart

:done
cls
echo All files were moved!!
pause
exit

El comando mover en el script mueve todos los elementos en dir_main también a las carpetas (con la excepción de las carpetas subdirectorias recién creadas), pero esto podría no ser un problema. También llevará bastante tiempo (powershell probablemente sería más rápido). También deberías ejecutarlo de una sola vez o subir la variable del contador (de lo contrario, comenzará de nuevo creando el subdir1). No es lo mejor, pero espero que te sea de alguna utilidad.

información relacionada