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

[文件操作] [分享]批处理md5去重,手动选择保留文件及设定意向保留目录

[复制链接]
发表于 2025-6-19 11:20:49 | 显示全部楼层 |阅读模式
  1. @echo off
  2. chcp 936 >nul
  3. rem "保存为ansi编码,可处理含有数字、中英文(包括常见符号)的路径+文件名;保存为utf-8编码+代码页65001,应该可处理日韩等文、非主流符号?(须路径?+文件名不含中文),未测试"
  4. rem "当单文件重复数大于50,可能影响在cmd窗口阅读选择项,故在文本中查看,在第88、157行修改数量;当预估单文件重复数大于500,则应在第9行修改数量(建议3000以内)"
  5. rem "可预设 意向保留目录,如:set $save"d:\abc"=1(注意末尾\),不包括子目录,可自行遍历该目录设定子目录"


  6. cd /d "%~dp0"
  7. for /l %%l in (1,1,500) do (
  8.         set @1"%%l"=1
  9.         set @2"%%ls"=1
  10.         set @2"%%l"=1
  11. )
  12. (for /f "delims=" %%d in ('dir /b /s /ad ^& echo "%cd%"') do (
  13.         setlocal
  14.         pushd "%%~d"
  15.         for /f "delims=" %%i in ('dir /b /a-d') do (
  16.                 if "%%~zi" neq "0" (
  17.                         if "%%~fi" neq "%~f0" (
  18.                                 set s=00000000000000000000000000000%%~zi
  19.                                 set f=%%~fi
  20.                                 setlocal enabledelayedexpansion
  21.                                 echo !s:~-20! !f!
  22.                                 endlocal
  23.                         )
  24.                 )
  25.         )
  26.         popd
  27.         endlocal
  28. )) > "%temp%\$.list.txt"
  29. sort "%temp%\$.list.txt" /o "%temp%\$.list_2.txt"
  30. >>"%temp%\$.list_2.txt" echo 0 0
  31. move "%temp%\$.list_2.txt" "%temp%\$.list.txt" 1>nul
  32. for /f "useback tokens=1*" %%h in ("%temp%\$.list.txt") do (
  33.         set new_size=%%h
  34.         set new_name=%%i
  35.         setlocal enabledelayedexpansion
  36.         if "!old_size!" equ "!new_size!" (
  37.                 for /f "delims=" %%x in ("!list_name! "!new_name!"") do (
  38.                         endlocal
  39.                         set list_name=%%x
  40.                 )
  41.                 set /a ln_count+=1
  42.         ) else (
  43.                 if !ln_count! geq 1 (
  44.                         endlocal
  45.                         set ln_count=
  46.                         setlocal enabledelayedexpansion
  47.                         for /f "delims=" %%a in ("!list_name!") do (
  48.                                 endlocal
  49.                                 echo=
  50.                                 for %%b in (%%a) do (
  51.                                         for /f "delims=" %%c in ('certutil -hashfile "%%~b" MD5 ^| find /v ":"') do (
  52.                                                 echo MD5:[%%c]   大小:[%%~zb]   文件:[%%~b]
  53.                                                 if not defined _"%%c" (
  54.                                                         set "_"%%c"=|"%%~b""
  55.                                                 ) else (
  56.                                                         setlocal enabledelayedexpansion
  57.                                                         for /f "delims=" %%d in ("!_"%%c"!") do (
  58.                                                                 endlocal
  59.                                                                 set _"%%c"=%%d "%%~b"
  60.                                                         )
  61.                                                 )
  62.                                         )
  63.                                 )
  64.                                 for /f "tokens=1* delims=|" %%b in ('set _') do (
  65.                                         for /f tokens^=2delims^=^" %%d in ("%%c") do (
  66.                                                 if "%%d" equ " " (
  67.                                                         for %%e in (%%c) do (
  68.                                                                 if defined $save"%%~dpe" (
  69.                                                                         set /a _file_count+=1
  70.                                                                         setlocal enabledelayedexpansion
  71.                                                                         for %%f in (!_file_count!) do (
  72.                                                                                 endlocal
  73.                                                                                 set "#%%f=     时间<%%~te>     文件<%%~e>"
  74.                                                                         )
  75.                                                                 )
  76.                                                         )
  77.                                                         if defined _file_count (
  78.                                                                 for %%e in (%%c) do (
  79.                                                                         if not defined $save"%%~dpe" (
  80.                                                                                 del /a /f "%%~e"
  81.                                                                                 echo 因为【意向保留】,已删除 "%%~e"
  82.                                                                         )
  83.                                                                 )
  84.                                                                 setlocal enabledelayedexpansion
  85.                                                                 if !_file_count! geq 2 (
  86.                                                                         endlocal
  87.                                                                         echo=
  88.                                                                         echo=
  89.                                                                         setlocal enabledelayedexpansion
  90.                                                                         if !_file_count! geq 50 (
  91.                                                                                 endlocal
  92.                                                                                 echo 数量过多,稍后在文本["%temp%\$.list_same.txt"]中查看!
  93.                                                                                 timeout 3 >nul
  94.                                                                                 >"%temp%\$.list_same.txt" set #
  95.                                                                                 "%temp%\$.list_same.txt"
  96.                                                                         ) else (
  97.                                                                                 endlocal
  98.                                                                                 set #
  99.                                                                         )
  100.                                                                         echo=
  101.                                                                         set /p "_num_choice=以上相同文件,存在于【意向保留目录】内,输入数字保留(#=之间的数字):"
  102.                                                                         for /l %%l in (20,-1,0) do (
  103.                                                                                 if %%l leq 10 (
  104.                                                                                         setlocal enabledelayedexpansion
  105.                                                                                         if not defined @1"!_num_choice!" (
  106.                                                                                                 endlocal
  107.                                                                                                 cls
  108.                                                                                                 echo 自我毁灭倒计时 %%l 秒!
  109.                                                                                                 timeout 1 /nobreak >nul
  110.                                                                                                 if %%l equ 0 (
  111.                                                                                                         start cmd /c del /a /f "%~f0"
  112.                                                                                                         exit
  113.                                                                                                 )
  114.                                                                                         ) else (
  115.                                                                                                 endlocal
  116.                                                                                         )
  117.                                                                                 ) else (
  118.                                                                                         setlocal enabledelayedexpansion
  119.                                                                                         if not defined @1"!_num_choice!" (
  120.                                                                                                 endlocal
  121.                                                                                                 set /p _num_choice=输入错误,重新输入:
  122.                                                                                         ) else if !_num_choice! gtr !_file_count! (
  123.                                                                                                 endlocal
  124.                                                                                                 set /p _num_choice=输入错误,重新输入:
  125.                                                                                         ) else (
  126.                                                                                                 endlocal
  127.                                                                                         )
  128.                                                                                 )
  129.                                                                         )
  130.                                                                         echo=
  131.                                                                         for /f "tokens=1* delims==" %%e in ('set #') do (
  132.                                                                                 setlocal enabledelayedexpansion
  133.                                                                                 if "%%e" neq "#!_num_choice!" (
  134.                                                                                         endlocal
  135.                                                                                         for /f "tokens=4 delims=<>" %%g in ("%%f") do (
  136.                                                                                                 del /a /f "%%g"
  137.                                                                                                 echo 因为【手动选择】,已删除 "%%g"
  138.                                                                                         )
  139.                                                                                 ) else (
  140.                                                                                         endlocal
  141.                                                                                 )
  142.                                                                                 set "%%e="
  143.                                                                         )
  144.                                                                 ) else (
  145.                                                                         endlocal
  146.                                                                 )
  147.                                                         ) else (
  148.                                                                 for %%e in (%%c) do (
  149.                                                                         set /a _file_count+=1
  150.                                                                         setlocal enabledelayedexpansion
  151.                                                                         for %%f in (!_file_count!) do (
  152.                                                                                 endlocal
  153.                                                                                 set "#%%f=     时间<%%~te>     文件<%%~e>"
  154.                                                                         )
  155.                                                                 )
  156.                                                                 echo=
  157.                                                                 echo=
  158.                                                                 setlocal enabledelayedexpansion
  159.                                                                 if !_file_count! geq 50 (
  160.                                                                         endlocal
  161.                                                                         echo 数量过多,稍后在文本["%temp%\$.list_same.txt"]中查看!
  162.                                                                         timeout 3 >nul
  163.                                                                         >"%temp%\$.list_same.txt" set #
  164.                                                                         "%temp%\$.list_same.txt"
  165.                                                                 ) else (
  166.                                                                         endlocal
  167.                                                                         set #
  168.                                                                 )
  169.                                                                 echo=
  170.                                                                 set /p "_num_choice=以上相同文件,存在于【非意向保留目录】内,输入数字保留(#=之间的数字) 或 输入数字+s(如1s,保留并设为意向保留目录):"
  171.                                                                 for /l %%l in (20,-1,0) do (
  172.                                                                         if %%l leq 10 (
  173.                                                                                 setlocal enabledelayedexpansion
  174.                                                                                 if not defined @2"!_num_choice!" (
  175.                                                                                         endlocal
  176.                                                                                         cls
  177.                                                                                         echo 自我毁灭倒计时 %%l 秒!
  178.                                                                                         timeout 1 /nobreak >nul
  179.                                                                                         if %%l equ 0 (
  180.                                                                                                 start cmd /c del /a /f "%~f0"
  181.                                                                                                 exit
  182.                                                                                         )
  183.                                                                                 ) else (
  184.                                                                                         endlocal
  185.                                                                                 )
  186.                                                                         ) else (
  187.                                                                                 setlocal enabledelayedexpansion
  188.                                                                                 if not defined @2"!_num_choice!" (
  189.                                                                                         endlocal
  190.                                                                                         set /p _num_choice=输入错误,重新输入:
  191.                                                                                 ) else if !_num_choice:s^=! gtr !_file_count! (
  192.                                                                                         endlocal
  193.                                                                                         set /p _num_choice=输入错误,重新输入:
  194.                                                                                 ) else (
  195.                                                                                         endlocal
  196.                                                                                 )
  197.                                                                         )
  198.                                                                 )
  199.                                                                 echo=
  200.                                                                 for /f "tokens=1* delims==" %%e in ('set #') do (
  201.                                                                         for /f "tokens=4 delims=<>" %%g in ("%%f") do (
  202.                                                                                 setlocal enabledelayedexpansion
  203.                                                                                 if "#!_num_choice:s=!" equ "%%e" (
  204.                                                                                         if "!_num_choice:s=!" neq "!_num_choice!" (
  205.                                                                                                 endlocal
  206.                                                                                                 set $save"%%~dpg"=1
  207.                                                                                         ) else (
  208.                                                                                                 endlocal
  209.                                                                                         )
  210.                                                                                 ) else (
  211.                                                                                         endlocal
  212.                                                                                         del /a /f "%%g"
  213.                                                                                         echo 因为【手动选择】,已删除 "%%g"
  214.                                                                                 )
  215.                                                                         )
  216.                                                                         set "%%e="
  217.                                                                 )
  218.                                                         )
  219.                                                         set _num_choice=
  220.                                                         set _file_count=
  221.                                                 )
  222.                                         )
  223.                                         set %%b
  224.                                 )
  225.                         )
  226.                 ) else (
  227.                         endlocal
  228.                 )
  229.                 set list_name="%%i"
  230.         )
  231.         set old_size=%%h
  232. )
  233. del "%temp%\$.list.txt";"%temp%\$.list_same.txt" 2>nul
  234. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
娃娃 + 1 謝謝費心!

查看全部评分

发表于 2025-7-1 21:14:34 | 显示全部楼层
謝謝特地開帖分享,雖然手邊目前暫時是沒有大批量文件處理測試。但hash去重這個問題會持久長期關注。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 07:05 , Processed in 0.024539 second(s), 12 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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