
Tengo un proceso que se ejecuta aproximadamente cada mes. Dicho proceso identifica un conjunto de archivos y construye una ruta de origen y destino adecuada a partir de varios campos de diferentes tablas en la base de datos para luego copiar todos estos archivos, por lo que termino con potencialmente cientos de miles o millones de rutas. Es posible que estas rutas apunten a un archivo que haya sido copiado previamente, pero que haya sido modificado.
¿Cómo puedo realizar esta copia de la forma más rápida posible?
Al principio probé un script cmd enorme y simple que verificaba si el archivo, según la ruta resultante, existía en la ruta de destino y luego intenté copiarlo si no existía, pero los archivos modificados se omitieron. Entonces, intenté usar "xcopy" para evitar la sobrescritura si la fecha es la misma, usando el interruptor /D y el interruptor /Y para confirmar silenciosamente el mensaje, pero en la práctica, un script enorme con cientos de miles de comandos xcopy toma para siempre y no veo ninguna aceleración cuando algunos o la mayoría de estos archivos ya existen con la misma fecha. ¿Tienes alguna idea que pueda ayudarme? ¿Qué puedo hacer con un archivo que contiene cientos de rutas de origen y destino para hacer una copia de todas ellas? ¿Existe una alternativa más rápida a xcopy? ¿O una verificación de fecha más rápida y luego llamar a cualquier comando de copia?
Una explicación más detallada sobre cómo obtengo y copio archivos actualmente según la información de la base de datos: Hay varias tablas en la base de datos:
Tabla 1: ID, Dir_Name, ...
Tabla 2: ID, Dir_Name, ...
...
Tabla N: ID, Dir_Name, ...
Tabla de rutas de carpetas de origen: Dir_Name, Dir_FullPath
Tabla de rutas de carpetas de destino: Dir_Name, Dir_FullPath
Luego puedo crear el conjunto de comandos de copia (o simplemente obtener las rutas de origen y destino)
Select 'xcopy /d /y '|| T2.Dir_FullPath || '\\' || ID || '.ext ' || T3.Dir_FullPath || '\\' || ID || '.ext*'
from Table1 T1
left join SourceFolderPathsTable T2 on T1.Dir_Name=T2.Dir_Name
left join DestFolderPathsTable T3 T1.Dir_Name=T3.Dir_Name where T1.some_criteria=true;
¡Gracias!
Respuesta1
Eche un vistazo a la herramienta de línea de comandos "robocopy" que viene con Windows. Creo que puede aceptar un archivo de respuesta, y ya se le puede indicar que actualice solo los archivos que han cambiado de fecha/hora, además es lo más rápido posible, ya que es una línea de comando pura sin sobrecarga de GUI.