Board logo

标题: [文本处理] 批处理如何删除大批量相同大小的文件 [打印本页]

作者: sinoshon    时间: 2021-4-17 17:41     标题: 批处理如何删除大批量相同大小的文件

请教各位大佬:在同一个文件夹内,怎样批量删除大小相同,且格式相同的文件(只保留一个),Thanks♪(・ω・)ノ!
作者: newswan    时间: 2021-4-17 18:44

  1. @echo off
  2. setlocal enableDelayedExpansion
  3. for %%a in (txt jpg) do (
  4.     set s=
  5.     for /f %%a in ('dir /b /os *.%%a') do (
  6.         if "!s!"=="%%~za" (
  7.             echo %%a %%~za
  8.         ) else (
  9.             set s=%%~za
  10.         )
  11.     )
  12. )
复制代码
第一个 for 里面填要处理的文件的格式
作者: sinoshon    时间: 2021-4-18 08:17

第一个 for 里面填要处理的文件的格式
newswan 发表于 2021-4-17 18:44



非常感谢大佬的回复,我是检测和删除MP4格式文件的,我把您上面的代码for里面的改成mp4后,发现dos系统可以检测文件,但是并没有删除多余相同大小的文件。烦请您在帮看看或测试一下,万分感谢!!!
作者: Batcher    时间: 2021-4-18 11:35

回复 3# sinoshon


    第8行下面加上 del 命令试试
作者: smss    时间: 2021-4-18 11:52

  1. @Echo off&SetLocal EnableDelayedExpansion
  2. for /f "tokens=*" %%a in ('dir/a-d/b/oe *.mp4')do set/a c+=1&set a!c!=%%a&set b!c!=%%~za&set c!c!=%%~xa
  3. for /l %%a in (1,1,%c%)do set/a d=%%a+1&for /l %%b in (!d!,1,%c%)do if not !b%%a!.==. call :1 %%a %%b
  4. goto :eof
  5. :1
  6. if !b%1!==!b%2! if !c%1!==!c%2! set b%2=&del "!a%2!"
  7. goto :eof
复制代码

作者: xp3000    时间: 2021-4-18 13:15

本帖最后由 xp3000 于 2021-4-21 09:24 编辑

同样大小容易误删,这个根据MD5删除,包含子文件夹也不保留第二个
想到如果强行关闭,下次可能回造成误删,在结尾和开头都添加了删除log
  1. @cd "%~dp0"
  2. @echo off&setlocal enabledelayedexpansion
  3. del /F /S /Q "%~dp0*.log"&cls
  4. for /f "delims=" %%a in ('dir /a-d /b /s *.JPG *.BMP *.PNG') do (
  5.     for /f "delims=" %%b in ('certutil -hashfile "%%a" MD5^|findstr /V 哈希^|findstr /V 完成') do (
  6.     set "MD5=%%b"&set MD5=!MD5:^ =!&echo !MD5!-%%a|sort /+1>>"%~dp0!MD5!.log"
  7.          for /f "tokens=1,*delims=-" %%i in ('findstr /n /i "!MD5!" !MD5!.log^|findstr /v  "^1:"') do (
  8.          del "%%j" 2>nul
  9.         )
  10.     )
  11. )
  12. del /F /S /Q "%~dp0*.log"&cls
  13. echo 删除完成
  14. pause
复制代码
如果子文件夹不处理,将dir /a-d /b /s改为dir /b/a-d/oN

结合楼下直接这个在临时文件夹处理
  1. @echo off&setlocal enabledelayedexpansion
  2. @cd "%~dp0"&if exist "%temp%\MD5" del "%temp%\MD5\*.log" >nul 2>nul
  3. for /f "delims=" %%a in ('dir /a-d /b /s *.*') do (
  4.     for /f "delims=" %%b in ('certutil -hashfile "%%a" MD5^|findstr /r /be /c:"[0-9a-f][0-9a-f ]*"') do (
  5.     set "MD5=%%b"&set MD5=!MD5:^ =!&echo !MD5!-%%a|findstr "!MD5!"|sort /+1 >>"%temp%\MD5\!MD5!.log"
  6.         for /f "tokens=1,*delims=-" %%i in ('findstr /n /i "!MD5!" "%temp%\MD5\!MD5!.log"^|findstr /v  "^1:"') do del "%%j" 2>nul
  7.         )
  8.     )
  9. for /f "tokens=*" %%k in ('dir/s/b/ad^|sort /r') do rd "%%k" >nul 2>nul& del "%temp%\MD5\*.log" >nul 2>nul&echo 删除完成
  10. pause
复制代码

作者: qixiaobin0715    时间: 2021-4-18 16:31

certutil -hashfile "%%a" MD5^|findstr /V 哈希^|findstr /V 完成
一次过滤也可:
certutil -hashfile "%%a" MD5^|findstr /r /be /c:"[0-9a-f][0-9a-f ]*"
作者: newswan    时间: 2021-4-18 16:36

对媒体文件,用 "重复文件检查器" 比较好
作者: xp3000    时间: 2021-4-18 17:02

不怎么会用FINDSTR,有没有更精简的方法




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2