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

[文件操作] [已解决]批处理能否实现删除重复图片

[复制链接]
发表于 2023-8-19 13:45:01 | 显示全部楼层
回复 30# 77七


    用自带的certutil就可以计算各类哈希值

评分

参与人数 1技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

发表于 2023-8-19 14:08:21 | 显示全部楼层
回复 31# buyiyang


   谢谢大佬指点!重新写了一个。
  1. @echo off
  2. rem http://bbs.bathome.net/redirect.php?goto=findpost&ptid=53343&pid=221896
  3. for /r /d %%d in (*) do (
  4.         pushd "%%d"
  5.         setlocal
  6.         for %%a in (*.jpg) do (
  7.                 for /f %%i in ('certutil -hashfile "%%a" MD5 ^| findstr /v "[^0-9a-z]"') do (
  8.                         if defined _"%%i" (
  9.                                 del "%%a"
  10.                         ) else (
  11.                                 set _"%%i"=1
  12.                         )
  13.                 )
  14.         )
  15.         endlocal
  16.         popd
  17. )
  18. pause
复制代码

评分

参与人数 1技术 +2 收起 理由
a475012621 + 2 感谢分享

查看全部评分

发表于 2023-8-19 20:05:24 | 显示全部楼层

对图片/音频/视频去重是个常用操作,尤其是用文件的哈希值(md5)比对去重是个比较高效的方法,但用批处理脚本实现,至少有两个很有用的经验可供参考》
一。应该先对目标目录中的文件按尺寸排序,以便能够忽略其中大部分尺寸相异者,若舍此而去遍历每个文件计算其哈希值,当文件量过千后就有些难受了。例如,5000个文件去重了10个,即可估算前后两种方法所需哈希值计算量的效率之差了。
二。采用纯P的“字典”数据表来对应所有处理对象,比折腾外部数据交换的效率高很多,但会受限于CMD的8k个变量总空间,也就是处理对象/文件数量不要超过此限。好在个人家用较少有单个目录文件量超过此限,因此,单个目录的文件去重,对于纯P是可以驾驭的。

评分

参与人数 1技术 +1 收起 理由
a475012621 + 1 感谢分享

查看全部评分

 楼主| 发表于 2023-8-19 23:57:32 | 显示全部楼层
回复 29# wanghan519


    链接:https://pan.baidu.com/s/1NK6rIHtoy1QLbsnoMYTRyw?pwd=ixl0
提取码:ixl0
--来自百度网盘超级会员V2的分享
 楼主| 发表于 2023-8-20 00:05:35 | 显示全部楼层
回复 32# 77七


    感谢,可以了
发表于 2023-8-20 01:13:13 | 显示全部楼层
回复 32# 77七

不知为啥,我这边运行时,第7行for in里面那句certutil -hashfile "%%a" MD5 ^| findstr /v "[^0-9a-z]" 结果总是空的
发表于 2023-8-20 01:48:24 | 显示全部楼层
回复 36# Five66


   0字节文件好像不能获取md5
发表于 2023-8-20 01:55:08 | 显示全部楼层
回复 37# 77七

不是0字节文件,不知道是不是是系统问题,我这里(不是win10系统)输出的md5好像是带有空格的:
输出是这样的:
MD5 hash of file 33.jpg:
71 51 39 e0 db b7 2e f2 89 ce 4a 3c 02 92 7b 50
CertUtil: -hashfile command completed successfully.
发表于 2023-8-20 02:03:03 | 显示全部楼层
回复 38# Five66


  
改为find /v ":",过滤,可能更好,看了好几个帖子,都用的findstr
发表于 2023-8-20 02:10:30 | 显示全部楼层
回复 39# 77七

findstr /e "[0-9a-z]" 也能过滤,不过还得处理空格
发表于 2023-8-20 04:32:41 | 显示全部楼层
回复 34# a475012621


    修改了一下powershell代码,一会再试试先比较大小,再算md5,以加快速度
  1. cd 测试
  2. $d=@{};dir -File -Recurse | sort -Descending | % {$m=$_.DirectoryName+""+(Get-FileHash $_.FullName -Algorithm MD5).Hash;if($d.ContainsKey($m)){rm $_.FullName}else{$d.Add($m,1)}}
复制代码

评分

参与人数 1技术 +1 收起 理由
a475012621 + 1 乐于助人

查看全部评分

 楼主| 发表于 2023-8-20 10:55:52 | 显示全部楼层
回复 41# wanghan519


    谢谢,费心了,应该没问题了
发表于 2023-8-20 13:30:57 | 显示全部楼层
本帖最后由 aloha20200628 于 2023-8-20 14:12 编辑


如此设置 findstr 的匹配参数,还为防止目标文件名出现 “e3 b4 a5.jpg” 的特殊情况...

  1. certutil -hashfile "1.jpg" md5 | findstr /rbc:"[0-9a-z][0-9a-z] "
复制代码

评分

参与人数 1技术 +1 收起 理由
a475012621 + 1 感谢分享

查看全部评分

发表于 2025-7-14 20:48:29 | 显示全部楼层
回复  77七

不是0字节文件,不知道是不是是系统问题,我这里(不是win10系统)输出的md5好像是带有空格 ...
Five66 发表于 2023-8-20 01:55



    遇到了跟Five66君一样的问题,请问如何设置过滤条件才能使输出没有空格呢?
发表于 2025-7-14 22:56:04 | 显示全部楼层
回复 44# 娃娃


    自己处理下就行了 ,比如设置成变量 ,然后将变量内容里面的空格替换成空
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 07:28 , Processed in 0.013215 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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