我有超过 100 万个(小尺寸)文件(<500kB 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 是机器名称,而文件夹是另一个递增的数字。
我需要一份具有相同结构的 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_sub_folderA 成功复制到 Z:\main_folder\folder\sub_folder\sub_sub_folder\sub_sub_folder\sub_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”
ETC
标记日志的结尾(一行 ====== 或其他内容),然后才继续下一个操作(复制 sub_sub_sub_folderB 的内容和文件夹结构)。如果复制操作未成功终止,则创建一个新的日志 error_sub_sub_sub_folderB.txt(下一个日志将是 error_sub_sub_sub_folderZ.txt),并且只有在创建日志后才移动到下一个 sub_sub_sub_folder
简而言之:逐步记录复制批处理,不会破坏系统或机器硬件资源。
答案1
xcopy 和 robocopy 都可以完成这项工作,但是 robocopy 的输出更接近您所描述的。
xcopy src dst /i /e /f /v /c > log.txt
/F 将输出完整的源路径和目标路径。
/V 声称可以验证文件大小,但不会在输出中打印它们。
除了没有记录文件大小之外,这基本上实现了您所描述的内容。还有其他开关可以控制是否复制 ACL 和属性。作为本机 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
仅遍历目录。