返回列表 发帖

[文件管理] 批处理根据MD5值查找重复文件

新版本更新在 2楼:
更新内容:
1.可一次处理多个文件和文件夹;
2.可对单个或两个MD5列表文件处理;
3.可根据原有的MD5列表文件对多个文件和文件夹进行处理;
4.如上,适应性会更强些;
初始代码已清除COPY
md5.exe 程序简单介绍:
要获得帮助请输入:md5.exe -h ,其他方式诸如/?、/h、/help等无效
md5 -h
MD5  --  Calculate MD5 signature of file.  Call
             with md5 [ options ] [file ...]
         Options:
              -csig   Check against sig, set exit status 0 = OK
              -dtext  Compute signature of text argument
              -l      Use lower case letters for hexadecimal digits
              -n      Do not show file name after sum
              -ofname Write output to fname (- = stdout)
              -u      Print this message
              -v      Print version information
by John Walker  --  http://www.fourmilab.ch
Version 2.0 (2003-04-15)
This program is in the public domain.
cn:
                - csig        核对文字签名,设置退出状态 0 = OK
                        -cMD5 fname
                        if %ERRORLEVEL%==0  OK
                        if %ERRORLEVEL%==1  error
                - dtext        计算字符串参数的文字签名
                        要验证 字符串的 MD5 值,就输入 md5.exe -d123456
                        -d后面的字符不能带有空格,引号"会被忽略
                - l        的十六进制数字使用小写字母
                - n        不显示文件名
                - ofname        写输出到文件:fname
                - u        显示帮助信息
                - v        显示版本信息
该程序是在公共领域。
md5 [drive[path]]
[*.ext]
md5<01.txt 等同于 md5 01.txt
md5 -d^
系统就会提示 more? 输入字串就可以计算MD5了
结论:
123456                对应于:        md5<01.txt (01.txt只有一行"123456" 无回车换行)
                        md5.exe -d123456
                        echo.|set /p=123456|md5 -n
                        set/p=123456^<nul|md5 -n
set /p=123456<nul|md5 -n
e10adc3949ba59abbe56e057f20f883e
123456空格        对应于:        md5<01.txt (01.txt只有一行"123456 " 有一个空格)
                        set /p=123456<nul|md5 -n
7e8feb2276322ecddd4423b649dfd4d9
123456回车 对应于: echo 123456| md5.exe
41933e60e9c19b866b3d68864727afe7
123456空格回车 对应于: echo 123456 | md5.exe
d170064a1951ad13095734a657c5a30fCOPY
MD5文件下载: http://bbs.bathome.net/thread-2142-1-1.html
findDupFile.bat 这个是最老版本,不要下了:
1

评分人数

@goto start
:help
@echo.===== Ver: 1.1 =========================== 发布日期: 2010-09-24 =======
@echo. BAT_NAME: findDupFile.bat
@echo. 返回值: %ret_filename%
@echo. 作用  : 根据MD5值查找重复文件
@echo. 调用: ①findDupFile.bat [Path [EXT]] [file]
@echo. ②findDupFile.bat [Path [EXT]] [file] [MD5_file1]
@echo. ③findDupFile.bat [MD5_file1] [MD5_file2]
@echo. [Path]: 文件夹路径 (可以是多个)
@echo. [file]: 文件 (可以是多个)
@echo. [EXT] : 文件后缀 如:"*.jpg *.bmp",带空格的必须用引号括起来
@echo. [MD5_file] : MD5文件,形如"*_MD5.txt",带空格的必须用引号括起来
@echo.====================== Copyright@ by hf-g ========= [彭城] ============
ping /n 4 127.1>nul
goto:end
:start ============================================================
@echo off&setlocal
path=%path%;%~d0\DOS\command\第三方命令行程序
set "ret_filename=%~dp0.\ret_List.txt"
if /i "%~1"=="" goto help
if /i "%~1"=="-?" goto help
set "ext="&set "pathname="&set "Dir_name="&set "MD5_file1="&set "MD5_file2="&set "p_str="
set /a exit_BL=0,D_count=0,f_count=0
call:get_P %*
if "%exit_BL%"=="1" goto end
::设置临时文件
set "tmpfname=%pathname_0:~-2%"
if "%tmpfname%"==":\" (
set "Dir_name=drive_%pathname_0:~0,1%"
call echo 驱动器名: %%Dir_name%%
) else (
if "%pathname_0:~-1%"=="\" (
call call:extpath "%%pathname_0:~0,-1%%"
call echo 文件夹名: %%Dir_name%%
) else (
if exist "%~1\" (
set "Dir_name=%~nx1"
call echo 文件夹名: %%Dir_name%%
)
)
)
if %f_count% GTR 0 set "Dir_name=list"
if %D_count% GTR 1 set "Dir_name=list"
set "tmpfname=%~dp0.\%Dir_name%_MD5.txt"
cd.>"%ret_filename%"
echo 生成MD5文件:    %tmpfname%
echo 相同文件列表:    %ret_filename%
echo 删除重复文件BAT: del_list.bat
::========================MAIN============================
::生成MD5文件,可一次处理多个文件夹和文件,只在批处理所在文件夹生成1个MD5文件.
::set "ext=*.jpg *.bmp"
set/a D_count-=1,f_count-=1
if not "%pathname_0%"=="" (
cd.>"%tmpfname%"
for /l %%i in (0,1,%D_count%) do (
call pushd "%%pathname_%%i%%"
(for /f "tokens=* delims=" %%i in ('dir /a-d/b/s %ext%') do (md5 "%%i"))>>"%tmpfname%"
popd
))
if not "%file_0%"=="" (
if "%pathname_0%"=="" cd.>"%tmpfname%"
for /l %%i in (0,1,%f_count%) do (call md5 "%%file_%%i%%")>>"%tmpfname%"
)
::处理MD5文件━━━━━━━━━━━━━━━━━━━━━━━━━━━━
cd.>"%~dp0.\del_list.bat"
if "%MD5_file1%"=="" (
rem =========查找上面"生成MD5文件"中相同的文件,删除重复的====
call:MD5_1file "%tmpfname%"
) else (
if "%MD5_file2%"=="" (
if not exist "%tmpfname%" (
rem =========查找原有的唯一MD5列表文件中相同的文件,删除重复的====
call:MD5_1file "%MD5_file1%"
) else (
rem =========查找上面"生成MD5文件"与原有MD5文件中相同的文件,删除重复的====
call:MD5_2file "%MD5_file1%" "%tmpfname%"
)
) else (
rem =========查找原有MD5_file1与原有MD5_file2文件中相同的文件,删除重复的====
call:MD5_2file "%MD5_file1%" "%MD5_file2%"
)
)
:end ==============================================================
::if exist "%tmpfname%" del "%tmpfname%" "%~dp0.\del_list.bat"
exit /b
::=========查找MD5列表文件中相同的文件,删除重复的====
:MD5_1file MD5_file
for /f "tokens=1* delims= " %%a in ('type "%~1"') do (
set/p =-<nul
if defined _MD5_%%a (
set/p =\<nul
echo @del /f/q "%%b">>"%~dp0.\del_list.bat"
set/p =^|<nul
if not defined _write_%%a (findstr "^%%a" "%~1">>"%ret_filename%"&echo.>>"%ret_filename%"&set "_write_%%a=1")
) else (
set "_MD5_%%a=1"
)
set/p =/<nul
)
goto:eof
::=========查找MD5_file1中与MD5_file2相同的文件,删除MD5_file2中重复的====
:MD5_2file MD5_file1 MD5_file2
(echo MD5_file1=%~1&echo MD5_file2=%~2)>con
(echo MD5_file1=%~1&echo MD5_file2=%~2&echo.)>>"%ret_filename%"
for /f "tokens=1* delims= " %%a in ('type "%~1"') do (set "_MD5_%%a=%%b")
for /f "tokens=1* delims= " %%a in ('type "%~2"') do (
set/p =-<nul
if defined _MD5_%%a (
set/p =\<nul
echo @del /f/q "%%b">>"%~dp0.\del_list.bat"
set/p =^|<nul
(set _MD5_%%a&echo      %%a %%b&echo.)>>"%ret_filename%"
set/p =/<nul
)
)
goto:eof
::====================================================
:extpath
set "Dir_name=%~nx1"
goto:eof
::========================参数设置与获得============================
:get_p
::判断%1是_MD5.txt还是文件夹或其他文件或文件后缀
if "%~1"=="" goto:eof
set "p_str=%~1"
if exist "%p_str%" (
if "%p_str:~-8%"=="_MD5.txt" (
if "%MD5_file1%"=="" (
set "MD5_file1=%p_str%"&shift /1&goto get_p
) else (
set "MD5_file2=%p_str%"&shift /1&goto get_p
)
)
if exist "%p_str%.\" (
call set "pathname_%%D_count%%=%p_str%"&set /a D_count+=1&shift /1&goto get_p
)
call set "file_%%f_count%%=%p_str%"&set /a f_count+=1&shift /1&goto get_p
) else (
if "%ext%"=="" (
if "%p_str:~0,2%"=="*." (
set "ext=%p_str%"&shift /1&goto get_p
)
)
echo %p_str% 不是一个正确的文件夹路径或文件^!&set /a exit_BL=1&shift /1&goto end
)
@echo off
:get_p_end
goto:eofCOPY
链接: https://pan.baidu.com/s/12tmDkBEy0n-xWmbVNUpcbw?pwd=qix3

TOP

例子:
例子1: 查询 "G:\DOS\源码\29单身宿舍人员统计\" 文件夹中的重复文件,
把该文件夹拖到批处理上, 将生成如下3个文件:
①目标文件夹下所有文件的MD5列表文件: 源文件夹名_MD5.txt
②MD5重复的文件列表:                                  ret_List.txt
③构建好的删除多余重复文件的bat文件:    del_list.bat
29单身宿舍人员统计_MD5.txt         内容:
D41D8CD98F00B204E9800998ECF8427E  G:\DOS\源码\29单身宿舍人员统计\!234.txt
7D9FC79D6A8A320B3DC7B01FB90C79A5  G:\DOS\源码\29单身宿舍人员统计\29单身宿舍人员统计.bat
6FBCD072CBD00807F17DACFDCFACF8A9  G:\DOS\源码\29单身宿舍人员统计\29单身宿舍人员统计.exe
FA5ABD1410C43B23A52FD4EF28BBAFBE  G:\DOS\源码\29单身宿舍人员统计\AllPeople.txt
09A7E7205F0ED587242CA8AFD5552D9E  G:\DOS\源码\29单身宿舍人员统计\AllPeople1.txt
45F694C0558CB0255EDA33614597745E  G:\DOS\源码\29单身宿舍人员统计\filelist.txt
966A5E501EDD8CD23CA632773048BA26  G:\DOS\源码\29单身宿舍人员统计\Form1.frm
7331124867F742C3F1DBB39DDECF1396  G:\DOS\源码\29单身宿舍人员统计\MSSCCPRJ.SCC
C734E30DABB5901341E5F499D2448340  G:\DOS\源码\29单身宿舍人员统计\rar打包.bat
6DAAEF9B830CD36A93D0B7198B1014DC  G:\DOS\源码\29单身宿舍人员统计\sortfile.bat
CAA41244FB91DC85968C845F42AC240B  G:\DOS\源码\29单身宿舍人员统计\名字常用字.txt
D41D8CD98F00B204E9800998ECF8427E  G:\DOS\源码\29单身宿舍人员统计\复件 !234.txt
6FBCD072CBD00807F17DACFDCFACF8A9  G:\DOS\源码\29单身宿舍人员统计\复件 29单身宿舍人员统计.exe
1E973166964A66CA79A0E07FDFA01122  G:\DOS\源码\29单身宿舍人员统计\工程1.vbp
97B09906C471FA387B2862973DA9BA2E  G:\DOS\源码\29单身宿舍人员统计\工程1.vbw
BA905050B73B10F90D48EA1674BABC59  G:\DOS\源码\29单身宿舍人员统计\查询女职工.txt
77D2695EA3D4164FCBC680061CF57E14  G:\DOS\源码\29单身宿舍人员统计\百家姓.txt
083C860A2F4149972ADD011BC3D48280  G:\DOS\源码\29单身宿舍人员统计\随机姓名生成.bat
4536A3B26AD38A56D43ECE0D1929682F  G:\DOS\源码\29单身宿舍人员统计\photo\320323198003097032.JPG
82AA1106DD26203867CF957B5048642B  G:\DOS\源码\29单身宿舍人员统计\photo\NOIMAGE.jpg
               
ret_List.txt        内容:
D41D8CD98F00B204E9800998ECF8427E  G:\DOS\源码\29单身宿舍人员统计\!234.txt
D41D8CD98F00B204E9800998ECF8427E  G:\DOS\源码\29单身宿舍人员统计\复件 !234.txt

6FBCD072CBD00807F17DACFDCFACF8A9  G:\DOS\源码\29单身宿舍人员统计\29单身宿舍人员统计.exe
6FBCD072CBD00807F17DACFDCFACF8A9  G:\DOS\源码\29单身宿舍人员统计\复件 29单身宿舍人员统计.exe
   
del_list.bat   内容:

@del /f/q "G:\DOS\源码\29单身宿舍人员统计\复件 !234.txt"
@del /f/q "G:\DOS\源码\29单身宿舍人员统计\复件 29单身宿舍人员统计.exe"

TOP

回复 3# hfg1977


    你好,能不能根据“不同md5” 但“相同文件名”进行分类呢,把它们移动到一个文件夹内,因为有的文件版本不同,想要把它们都放到一个文件夹内,但是Windows还不允许一个文件夹内有重名文件,所以不知道能不能实现相同文件名不同md5值的文件在创建个 以"文件名" 为名称的 "文件夹" 下面  在创建多个子文件夹 来存放这些个文件

TOP

回复 4# gie


   没必要使用MD5吧~   除非要排除“相同MD5”但“不同文件名的文件”

   搂主挺聪明的,这东西我正需要呢!

TOP

主要是效率问题啊,面对大量文件一个个算 MD5 的速度太慢了,所以只能是小范围使用,而若小范围使用,光用 fc /b 就能解决问题了...
感觉 64K 以下的文件最好能不靠 MD5,用 vbs 不换行输出所有文件的十六进制码到文件,然后 sort 排序,估计会快很多,而且也更准确
话说 fastcoll 一出现,MD5 也杯具了

TOP

这就是处理对象的不同要采用不同的方法.

比如: 作为一个集图爱好者我有100+G的图片, 已经有其MD5文件, 当我在收集到1000张图片时, 只需计算这1000张的MD5, 删除重复的, 并累积到100+G的MD5文件中.
这样对于后续的图片分类,重命名等都会方便很多...

上述工作我没有找到更好的方法.
“阿姐走了。。。可是。。。我。。。我愿意。”

TOP

真是强悍的楼主,强悍的bat

TOP

大神大神,现在win10不是可以直接输入certitul -hashfile 文件 md5,来获取md5吗,是否可以修改一下批处理,不借用第三方的md5.exe呢

TOP

回复 9# lancer


根据MD5删除当前目录下(不包含子文件夹)重复文件.bat
@echo off
cd /d "%~dp0"
for /f "delims=" %%i in ('dir /b /a-d /od') do (
    for /f %%j in ('certutil -hashfile "%%i" MD5 ^| find /v ":"') do (
        if defined _"%%j" (
            echo del /f /q "%%i"
        ) else (
            set _"%%j"=1
        )
    )
)COPY
根据MD5删除当前目录下(包含子文件夹)重复文件.bat
@echo off
cd /d "%~dp0"
for /f "delims=" %%i in ('dir /b /s /a-d /od') do (
    for /f %%j in ('certutil -hashfile "%%i" MD5 ^| find /v ":"') do (
        if defined _"%%j" (
            echo del /f /q "%%i"
        ) else (
            set _"%%j"=1
        )
    )
)COPY
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表