找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 12691|回复: 14

[原创代码] [Perl]硬盘对拷文件后批量校验MD5

[复制链接]
发表于 2025-3-6 13:05:46 | 显示全部楼层 |阅读模式
本帖最后由 523066680 于 2025-3-6 23:54 编辑

robocopy 是坠吼的,从来没用过这么好的工具,学习了!
发表于 2025-3-6 16:19:30 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-3-6 16:32 编辑

回复 1# 523066680

试过系统内置的 robocopy 吗? 自称 ‘Windows的可靠文件复制 ’(自行校验)其默认设置是同启8个线程并行开工...
用如下一行流代码,让 robocopy 完工后在当前目录下生成结果报告 F2G.log 以便检查核实...

  1. robocopy "F:\from" "G:\to" /s /log:"F2G.log" /v /fp /ts
复制代码
 楼主| 发表于 2025-3-6 19:52:59 | 显示全部楼层
回复 2# aloha20200628


    ?  听说robocopy并没有做MD5校验,而是时间戳和文件大小
发表于 2025-3-6 20:19:06 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-3-6 20:26 编辑

回复 3# 523066680

看其 log 文件中的 ‘相同’ 与否以及 ‘失败’、‘不匹配’ 等报告项还不足以检查核实 robocopy 的复制结果吗
 楼主| 发表于 2025-3-6 20:34:45 | 显示全部楼层
本帖最后由 523066680 于 2025-3-6 20:46 编辑

回复 4# aloha20200628


    它的  ‘相同’ 与否以及 ‘失败’、‘不匹配’   是以什么为依据呢?
我是遇到过使用robocopy复制的zip文件到移动硬盘,读取里面的csv数据(用的某个csv解析库),出现数据为空的情况。
但是我手动从本地重新复制到移动盘,这个数据为空的问题解决了。

robocopy 这个工具我在过去几乎每天用的,
  1. D:\Local\LData\202502>dir /b
  2. 2025-02-21.zip
  3. 2025-02-24.zip
  4. 2025-02-25.zip
  5. 2025-02-26.zip
  6. 2025-02-27.zip
  7. 2025-02-28.zip
  8. 同步到移动盘.bat
复制代码
同步到移动盘.bat
  1. @echo off & setlocal enabledelayedexpansion
  2. call :func %cd% yymm
  3. echo dirname : %yymm%
  4. mkdir L:\LData\!yymm! 2>nul
  5. robocopy /MIR D:\Local\LData\!yymm! L:\LData\!yymm!
复制代码
发表于 2025-3-6 20:56:42 | 显示全部楼层
回复 5# 523066680

历史上还未见ms自称那款产品是 ‘windows的可靠...’,但给 robocopy 赐了一顶 ...
 楼主| 发表于 2025-3-6 22:02:27 | 显示全部楼层
回复 6# aloha20200628


    ?这样就可靠吗
 楼主| 发表于 2025-3-6 23:13:00 | 显示全部楼层
本帖最后由 523066680 于 2025-3-7 08:01 编辑
回复  523066680

历史上还未见ms自称那款产品是 ‘windows的可靠...’,但给 robocopy 赐了一顶 ...
...
aloha20200628 发表于 2025-3-6 20:56
  1. use Modern::Perl;
  2. use File::Slurp;
  3. STDOUT->autoflush(1);

  4. my $src = ".\\robo_test";
  5. my $dst = "D:\\Temp\\robo_test";
  6. my $fname = "fluid-soundfont.tar.gz";
  7. my $target = "$dst\\$fname";

  8. # 这里模拟磁盘故障,导致部分节点写入数据为 NULL 的情况
  9. my $rawdata = read_file( "$src\\$fname", {binmode => ":raw"} );
  10. substr( $rawdata, 10240, 4, "\x00\x00\x00\x00" );
  11. write_file( $target, {binmode => ":raw"}, $rawdata );

  12. # 把源文件和目标文件赋予相同的 创建时间和修改时间
  13. system(qq(nircmd setfiletime "$src\\$fname" "06-06-2008 12:00:01" "06-06-2008 12:00:01" ));
  14. system(qq(nircmd setfiletime "$target" "06-06-2008 12:00:01" "06-06-2008 12:00:01" ));

  15. # “可靠” 的文件复制,基于硬盘是否可靠
  16. system(qq(robocopy /MIR "$src" "$dst" ));
复制代码
  1. # 结果
  2. #                总数        复制        跳过       不匹配        失败        其他
  3. #     目录:         1         0         1         0         0         0
  4. #     文件:         1         0         1         0         0         0
  5. #     字节:  124.25 m         0  124.25 m         0         0         0
  6. #     时间:   0:00:00   0:00:00                       0:00:00   0:00:00
复制代码
问题复现,模拟硬盘部分区域写入为空的情况:
手动复制并创建目标文件,将内容的某一位置4个字节改为 \x00\x00\x00\x00,再将文件的创建时间和修改时间 设为一致,再次执行Robocopy,结果显示跳过该文件的复制。
 楼主| 发表于 2025-3-6 23:28:50 | 显示全部楼层
本帖最后由 523066680 于 2025-3-7 08:00 编辑
回复  523066680

试过系统内置的 robocopy 吗? 自称 ‘Windows的可靠文件复制 ’(自行校验)其默认设 ...
aloha20200628 发表于 2025-3-6 16:19



    另外,对于向一个移动硬盘的文件对拷,机械硬盘,8个线程开工 有什么意义吗
 楼主| 发表于 2025-3-6 23:42:20 | 显示全部楼层
本帖最后由 523066680 于 2025-3-7 07:59 编辑

每天用robocopy同步压缩包,去年的11月左右出现这种问题,robocopy 每天同步一次,没有任何错误提示和终止。
直到有一次程序从移动盘加载当月某一个压缩包的数据显示空白,反复对比,发现手动拷贝过去后就正常了。

想着很久没来过了,发个贴吧,有人问我 Robocopy 用过没有,我说用过了,天天用。他又说 robocopy 很可靠,
我说就是用的robocopy,硬盘有问题,写入空白它没发现,他强调:官方认证的那种可靠 ……

怕了怕了,一定是我出了问题,你是对的。
发表于 2025-3-7 11:00:21 | 显示全部楼层
本帖最后由 aloha20200628 于 2025-3-7 11:04 编辑


这么多年无奈在 ms 的靶场上打靶,连枪和子弹也是他造的,怎么顺手合适,最终不过是个人经验和习惯
回帖本想给个提示,仅供参考,如此而已 ...
发表于 2025-3-7 14:57:43 | 显示全部楼层
回复 10# 523066680


    干嘛把主题帖的代码给删了啊?不是确定robocopy不带正文校验了吗?
发表于 2025-3-7 15:18:31 | 显示全部楼层
本帖最后由 qzwqzw 于 2025-3-7 15:23 编辑

之前只用过一次robocopy
后来用beyondcompare
再后来用duplicati
反正是没有再折腾命令行了
它的发布初衷是对标类Unix平台同时期发布的的rsync
但是后来好像活的不太好

印象中robocopy最早没有内置
是微软的某个资源包工具集里带的
相当于是“编外”工具
看那个命令行帮助的风格就很个性
只是后期被微软的Windows主家收编了
不仅给了正式编制
还叠上了卷影、多线程、SMB压缩等系统级buf
还自卖自夸的加上了“Windows 的可靠”标签
也不看看是谁在背书
好像Windows就多可靠一样

这种工具支持正文校验不是不行
只是别忘了它最初所强调的是性能、效率而不是可靠
而所有的校验算法包括CRC和HASH都需要牺牲性能
这种情况下该如何权衡其实是不难理解的
一般情况下我们会考虑增加一个校验的开关
然后默认关掉它

但微软可能觉得没有必要这么做
也许在他们认知的robocopy的绝大多数使用场景下
仅靠时间、大小、属性就可以判断文件的更新状态
再加上正文校验码纯属画蛇添足
也得亏是这样
其它同步软件才有了生存的空间
你的perl代码也才有了发布的由头

评分

参与人数 1PB +12 收起 理由
523066680 + 12

查看全部评分

 楼主| 发表于 2025-3-7 15:57:20 | 显示全部楼层
本帖最后由 523066680 于 2025-3-7 16:25 编辑

回复 12# qzwqzw


    其实就是很久没登陆了,拿个库存货发一下。具体原因已经忘得差不多了。
然后就有人推荐robocopy,花了很长时间去回忆当时为啥写这个,还要花时间去复现、验证,着实费时间。到后面反思一下:还不如把帖子删了清净。

对于新的硬盘,我从来不做校验。
对于一个出过问题,修复后还能用的硬盘,用来存一些旧归档文件,它依然有可能在(未来写入的)某个位置开始出现问题,所以刚拷贝进去的文件不校验肯定是不放心的。
发表于 2025-3-7 16:15:02 | 显示全部楼层
回复 14# 523066680


    怪不得还要黑体加粗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 06:24 , Processed in 0.024251 second(s), 12 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表