Mover un gran número de archivos en un directorio a varios directorios
-
23-09-2019 - |
Pregunta
Estoy buscando para crear un archivo por lotes de Windows para mover alrededor de 2.000 archivos y dividirlos por lo que hay 10 archivos por carpeta. He intentado crear un archivo por lotes, pero la sintaxis realmente perturba mi mente. Aquí es lo que tengo hasta ahora
@echo off
:: Config parameters
set /a groupsize = 10
:: initial counter, everytime counter is 1, we create new folder
set /a n = 1
:: folder counter
set /a nf = 1
for %%f in (*.txt) do (
:: if counter is 1, create new folder
if %n% == 1 (
md folder%nf%
set /a n += 1
)
:: move file into folder
mv -Y %%f folder%nf%\%%f
:: reset counter if larger than group size
if %n% == %groupsize% (
set /a n = 1
) else (
set /a n += 1
)
)
pause
Básicamente lo que hace este script es recorrer cada archivo .txt en el directorio. Se crea un nuevo directorio en el comienzo y se mueve 10 archivos en ese directorio, a continuación, crea una nueva carpeta de nuevo y se mueve otros 10 archivos en ese directorio, y así sucesivamente. Sin embargo, estoy teniendo problemas en los que la variable n
no se incrementa en el circuito? Estoy seguro de que hay otros errores también, ya que la ventana de CMD se cierra sobre mí, incluso con pause
. Cualquier ayuda o guía se agradece, gracias por su tiempo!
Solución
Algunas cosas que debe saber:
-
Se necesita
-
SETLOCAL ENABLEDELAYEDEXPANSION
, ya que está cambiando las variables y el uso de sus valores cambiados en un solo bloque con paréntesis.SET /?
en la línea de comandos le dará algo de información. Buscar en la Internet para este término y se encuentra una explicación mejor. - Los lugares que utilizan el formato
!nf!
para las variables se relaciona con la expansión retardada. - Como ghostdog74 mencionados, que no estaban incrementando
%nf%
. - I inicializado
nf
a 0 en vez de 1. De esta manera, el número de la carpeta que desea mover archivos a es el mismo que el número de la carpeta que acaba de crear. En su código, se crea folderX, entonces X de la subasta, y luego intenta mover el archivo a X + 1. - Usted tiene que usar
MOVE
para mover un archivo,MV
no es válido.
Esto funciona el archivo por lotes ... pero asegúrese de que la prueba! Sólo probado en una pequeña cantidad de archivos.
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
:: Config parameters
SET groupsize=10
:: initial counter, everytime counter is 1, we create new folder
SET n=1
:: folder counter
SET nf=0
FOR %%f IN (*.txt) DO (
:: if counter is 1, create new folder
IF !n!==1 (
SET /A nf+=1
MD folder!nf!
)
:: move file into folder
MOVE /Y "%%f" folder!nf!
:: reset counter if larger than group size
IF !n!==!groupsize! (
SET n=1
) ELSE (
SET /A n+=1
)
)
ENDLOCAL
PAUSE
Otros consejos
No está incrementando %nf%
.