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.