
Tengo más de 1 millón de archivos (de tamaño pequeño) (<500 kB jpg) en una estructura como esta:
H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folder
Cada sub_sub_sub_carpeta tiene entre 10 y 15 archivos, la sub_sub_carpeta podría ser una marca de fecha/hora, la subcarpeta es el nombre de la máquina y la carpeta es otro número incrementado.
Necesito tener una copia de main_folder con la misma estructura pero necesito verificar que mi copia sea 100% igual a la fuente. Windows Explorer se bloqueará después de ~1000 copias, ni siquiera muestra las propiedades (tamaño, tamaño en el disco, contenido).
Necesito un lote que vaya a H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA
leer y copiar los 14 atributos de los archivos y pegarlos Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA
, abrir un archivo log.txt, escribir:
"archivo1.jpg 490kB copiado de H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA a Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA correctamente ..."
y
"archivo15.jpg 470kB copiado de H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA a Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA correctamente"
etc.
marque el final del registro (una línea de ====== o algo así) y solo entonces continúe con la siguiente operación (copiar el contenido y la estructura de carpetas de sub_sub_sub_folderB). Si la operación de copia no finalizó exitosamente, deténgase, cree un nuevo registro error_sub_sub_sub_folderB.txt (el siguiente registro será error_sub_sub_sub_folderZ.txt) y solo después de crear el registro, pase a la siguiente sub_sub_sub_carpeta
En pocas palabras: un lote de copias de registro paso a paso que no mata el sistema ni los recursos de hardware de la máquina.
Respuesta1
Tanto xcopy como robocopy harán el trabajo, pero el resultado de robocopy se acerca más a lo que usted describió.
xcopy src dst /i /e /f /v /c > log.txt
/F generará las rutas de origen y destino completas.
Se afirma que /V verifica los tamaños de los archivos, pero no los imprime en la salida.
Además de no registrar los tamaños de los archivos, esto logra principalmente lo que usted describió. Hay otros conmutadores que pueden controlar si se copian las ACL y los atributos. Al ser un exe nativo, será más rápido que un bucle de script. Pero no obtendrá un registro de errores separado y no podrá cancelar una subcarpeta y continuar con la siguiente subcarpeta en caso de error (/C continúa con todos los archivos en caso de error).
Salida de muestra:
C:\Users\Celery\test>xcopy src dst /i /e /f /v /c
C:\Users\Celery\test\src\a\blah.txt -> C:\Users\Celery\test\dst\a\blah.txt
C:\Users\Celery\test\src\a\blah2.txt -> C:\Users\Celery\test\dst\a\blah2.txt
C:\Users\Celery\test\src\b\blah.txt -> C:\Users\Celery\test\dst\b\blah.txt
C:\Users\Celery\test\src\b\blah2.txt -> C:\Users\Celery\test\dst\b\blah2.txt
4 File(s)
Robocopy produce un registro bastante detallado, incluidos los tamaños de los archivos. Intentar:
robocopy src dst /e /np /log:log.txt [/tee]
Salida de muestra:
C:\Users\Celery\test>robocopy src dst /e
-------------------------------------------------------------------------------
ROBOCOPY :: Robust File Copy for Windows
-------------------------------------------------------------------------------
Started : Thursday, 22 January 2015 10:58:55 PM
Source : C:\Users\Celery\test\src\
Dest : C:\Users\Celery\test\dst\
Files : *.*
Options : *.* /S /E /DCOPY:DA /COPY:DAT /R:1000000 /W:30
------------------------------------------------------------------------------
New Dir 0 C:\Users\Celery\test\src\
New Dir 2 C:\Users\Celery\test\src\a\
New File 17 blah.txt
New File 17 blah2.txt
New Dir 2 C:\Users\Celery\test\src\b\
New File 17 blah.txt
New File 17 blah2.txt
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 3 3 0 0 0 0
Files : 4 4 0 0 0 0
Bytes : 68 68 0 0 0 0
Times : 0:00:00 0:00:00 0:00:00 0:00:00
Speed : 2193 Bytes/sec.
Speed : 0.125 MegaBytes/min.
Ended : Thursday, 22 January 2015 10:58:55 PM
De lo contrario, para programar la iteración usted mismo, necesitaría cuatro bucles anidados, como:
for /d %%a in (main_folder\*) do (
for /d %%b in (%%a\*) do (
for /d %%c in (%%b\*) do (
for /d %%d in (%%c\*) do (
:: code to copy files and write logs goes here
)
echo ================= end of %%d =============== >> log.txt
)
)
)
Eso solo copiará archivos en las sub_sub_sub_carpetas: cualquier archivo en carpetas de nivel superior se ignorará, porque for /d
solo itera sobre directorios.