Como copiar archivos según su tamaño en .bat

Tengo un problema que espero me pueda ayudar algún experto sobre el tema.

Resulta que por el trabajo que desempeño a diario necesito estar continuamente copiando información de bases de datos que se encuentra almacenada en varios ordenadores y las paso a diferentes USB o unidades extraíbles, por lo que estoy usando la siguiente rutina para hacer el proceso más cómodo, y la verdad que funciona muy bien:

IF NOT EXIST ".\cosas\"%USERNAME% MD ".\cosas\"%USERNAME%cd ".\cosas\"%USERNAME%

for /R %USERPROFILE%\Pictures\ %%x in (*.accdb) do copy "%%x" "%NOMBRE%BASE-DATOS"

Pues bien, el problema que tengo es que necesito sólo copiar algunos archivos que no superen un cierto tamaño, por ejemplo solo necesito copiar que se copien los archivos que pesen menos de 200 mb.

He visto por internet algunos ejemplos de cómo se hace el comando, pero no consigo insertarlo en la rutina mía anterior, por ejemplo, he intentado utilizar esto:

for /R %USERPROFILE%\Pictures\ %%x in (*.accdb) do copy "%%x" "%NOMBRE%BASE-DATOS"/MAX:1000

Pero no me funciona, no sé si hay que colocar el parámetro “MAX:” en otro lugar o es que no se hace de esta manera, pero yo necesito que en el script que utilizo pueda insertar ese parámetro de alguna manera.

Espero que alguien me pueda ayudar y lo agradecería muchísimo porque esto me lleva de cabeza ya bastante tiempo y es un engorro que se me copien todos los archivos y no poder separarlos por fecha o por tamaño.

1 Respuesta

Respuesta
1

Te sugiero que pruebes a sustituir el FOR que indicas por este otro:

for /R %USERPROFILE%\Pictures\ %%x in (*.accdb) do if %%~zx LSS 200000 copy "%%x" "%NOMBRE%BASE-DATOS"

Espero que el editor de la página no haga alguna de sus jugadas y transforme lo anterior en algo distinto.

Vaya! Funciona a la perfección! Muchas gracias has resuelto mi problema!

Y para que me filtrase además del tamaño, ¿por la fecha de modificación que sea posterior a enero de 2016?

El problema de la fecha es un poco más delicado. Antes de nada te diré que si escriber FOR /? en una ventana CMD te como se pueden obtener las características de los archivos (la ayuda les llama expansiones). La forma prevista de obtener la fecha (y hora) de un archivo usando esas expansiones sería, para nuestro ejemplo %%~tx sobre la variable %%x pero esto nos daría la fecha y hora en el "formato regional", en nuestro caso dd/mm/aaaa hh:mi. Por tanto me temo que no vamos a poder usar la expansión directamente, como hicimos con el tamaño (%%~zx). Creo que esto obliga a "explicitar" el bucle de instrucciones de la parte DO del FOR para poder poner más de una línea de instrucciones. Para simplificar voy a suponer que quieres que se copien los archivos creados en 2016 con tamaño menor de 200 MB. Si no tienes en el BAT la instrucción "Setlocal EnableDelayedExpansion" tendrás que incluirla en algún punto anterior para poder trabajar con variables locales, yo la incluyo abajo:

Setlocal EnableDelayedExpansion
for /R %USERPROFILE%\Pictures\ %%x in (*.accdb) do (
set fecha=%%~tx
set anyo=!fecha:~6,4!
if !anyo! GEQ 2016 if %%~zx LSS 200000 copy "%%x" "%NOMBRE%BASE-DATOS"
)

De todas formas creo que no estaría mal que le echaras un vistazo al comando xcopy porque tiene opciones que pueden resultar interesantes a la hora de filtrar las copias que se quieren hacer.

Una corrección, quizá innecesaria, pero bueno:

Donde decía:

... Si escriber FOR /? en una ventana CMD te como se pueden obtener las...

Debería decir:

... Si escribes FOR /? en una ventana CMD te dirá cómo se pueden obtener las...

Muchisimas gracias!! Has resuelto mis dudas perfectamente,  no me voy a complicar con lo de la fecha, con que me busque los de 2016 me es suficiente.

Un saludo!!

Me alegro muchísimo de que te haya servido. Y en cuanto a la "complicación" de tratar toda la fecha bien mirado tampoco es para tanto. Solo hay que darle a la fecha el formato aaaammdd para que las comparaciones entre fechas sean puramente "numéricas". Por ejemplo, si quieres filtrar que la fecha sea más reciente que el 08/01/2016 podrías hacerlo así:

Setlocal EnableDelayedExpansion
for /R %USERPROFILE%\Pictures\ %%x in (*.accdb) do (
set fecha=%%~tx
set fecha=!fecha:~6,4!!fecha:~3,2!!fecha:~0,2!
if !fecha! GEQ 20160108 if %%~zx LSS 200000 copy "%%x" "%NOMBRE%BASE-DATOS"
)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas