
У меня более 1 миллиона файлов (небольшого размера) (<500 КБ jpg) в такой структуре:
H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folder
Каждая подпапка sub_sub_sub_folder содержит 10-15 файлов, подпапка sub_sub_folder может быть отметкой даты/времени, подпапка sub_folder — это имя машины, а папка folder — это еще один увеличивающийся номер.
Мне нужна копия main_folder с той же структурой, но мне нужно убедиться, что моя копия на 100% совпадает с исходной. Проводник Windows заблокируется после ~1000 копий, даже не показывает свойства (размер, размер на диске, содержит).
Мне нужен пакет, который будет H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA
считывать и копировать все 14 атрибутов файлов и вставлять их Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_sub_folderA
, открывать файл log.txt, писать:
"file1.jpg 490kB успешно скопирован из H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_folderA в Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_folderA ..."
и
"file15.jpg 470kB успешно скопирован из H:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_folderA в Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_folderA"
и т. д.
отметьте конец журнала (одна строка ====== или что-то в этом роде) и только потом переходите к следующей операции (копирование содержимого и структуры папок sub_sub_sub_folderB). Если операция копирования не была успешно завершена, остановитесь, создайте новый журнал error_sub_sub_sub_folderB.txt (следующий журнал будет error_sub_sub_folderZ.txt) и только после создания журнала переходите к следующей sub_sub_sub_folder
В двух словах: пошаговое пакетное копирование журнала, не нарушающее работу системы или аппаратных ресурсов машины.
решение1
Оба инструмента — xcopy и robocopy — справятся с этой задачей, но вывод robocopy ближе к тому, что вы описали.
xcopy src dst /i /e /f /v /c > log.txt
/F выведет полные пути источника и назначения.
/V, как утверждается, проверяет размеры файлов, но не выводит их в выходных данных.
Помимо того, что размеры файлов не регистрируются, это в основном позволяет достичь того, что вы описали. Есть и другие переключатели, которые могут контролировать, копируются ли списки контроля доступа и атрибуты. Будучи собственным exe-файлом, он будет быстрее, чем цикл скрипта. Но вы не получите отдельный журнал ошибок, и вы не сможете прервать подпапку и продолжить со следующей подпапки при ошибке (/C продолжает все файлы при ошибке).
Пример вывода:
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 создает довольно подробный журнал, включая размеры файлов. Попробуйте:
robocopy src dst /e /np /log:log.txt [/tee]
Пример вывода:
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
В противном случае, чтобы самостоятельно написать сценарий итерации, вам понадобятся четыре вложенных цикла, например:
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
)
)
)
При этом будут скопированы только файлы в подпапках sub_sub_sub_folders: любые файлы в папках более высокого уровня будут проигнорированы, поскольку for /d
выполняется только итерация по каталогам.