Board logo

标题: [文件管理] 批处理版重复文件搜索与处理工具 [打印本页]

作者: cjiabing    时间: 2011-6-23 21:53     标题: 批处理版重复文件搜索与处理工具

在一台公用电脑上,经常有人拷一些歌过来存放,来来去去,久而久之,竟然有一半的歌是重复的!~
于是写了这个《重复文件搜索与处理工具》,用来搜索和处理掉那些重复的歌曲。
    搜索
个人认为效率一般般,能用就行。两三千的歌曲搜索用了一两分钟,在某些苛刻的人看来可能太慢!~
在用“'sort "%~dp0所有名称.txt”处理同文件名这段可能没有彻底处理掉重复文件名。
搜索结果不完全正确,但处理时能够保证正确。
findstr遇到特殊字符时可能罢工。
    处理
    改名:支持两次改名,即在重复文件的文件名前添加“重复_”,假如已经存在该文件名则再在前面添加“new_”。
    转移:一共保留两个重复的同文件名的文件。
    删除:仅保留一个,其他删除。
以上都会自动保留一个重复的文件,一般位于浅层目录。改名字时可能第一个目录被遗漏。
从改名到转移到删除,风险由低到高。
虽然说不保证百分百正确,但从代码可知,一般不会出问题。
当然,需要注意的是,所有操作仅以文件名称与文件大小来进行判断,假如文件名相同(包括后缀名相同)而文件内容不同,虽然程序判断为相同,但实际上是不同的。
  1. @echo off&setlocal enabledelayedexpansion
  2. ::by cjiabing&date 2011.6.23
  3. title 重复文件搜索与处理工具 Batch For Vistanita Duplicate Finder V1.1
  4. :VDFStart
  5. cls
  6. echo;
  7. echo;
  8. echo;                  *************************
  9. echo;                  *   重复文件搜索与处理  *
  10. echo;                  *************************
  11. echo;              
  12. echo; =============================================================================
  13. echo;    1、将本程序放到需要搜索目录下,双击开始运行,按任意键开始搜索。
  14. echo;    2、可能要几分钟时间,文件越多,需要时间越多。久不动时可能是文件有误。
  15. echo;    3、搜索使用“For /r”和“Findstr”命令,搜索结果可能不完全正确。
  16. echo;    4、处理使用“IF”匹配,提高了正确率。
  17. echo;    5、可对搜索结果中的重复文件进行改名、转移、删除等。
  18. echo;    6、以文件名进行判断,但无法判断文件内容,请仔细检查,谨慎操作!
  19. echo; =============================================================================
  20. echo;
  21. ::taskkill /f /t /im findstr.exe>nul 2>nul
  22. set input=
  23. set /p input=    请输入(搜索【F】;处理【D】):
  24. if "%input%"=="" goto VDFFind
  25. if /i "%input%"=="D" goto VDFCure
  26. if /i "%input%"=="F" goto VDFFind
  27. goto VDFStart
  28. :VDFFind
  29. set tm=%time%
  30. set tj=0
  31. set nb=0
  32. set /a var=str=1
  33. echo;
  34. echo;
  35. echo;    开始时间:%tm%
  36. echo;    正在搜索,请耐心等待……
  37. title    正在搜索,请耐心等待……
  38. echo;
  39. cd.>"%~dp0所有文件.txt"
  40. cd.>"%~dp0所有名称.txt"
  41. cd.>"%~dp0重复文件.txt"
  42. echo;
  43. for /r %%a in (*) do (echo %%a>>"%~dp0所有文件.txt"&echo %%~nxa>>"%~dp0所有名称.txt")
  44. echo;
  45. for /f "tokens=*" %%a in ('sort "%~dp0所有名称.txt"') do (
  46.     if not !var!==%%a (
  47.         set var=%%a
  48.         set /a tj+=1
  49.         set str=
  50.         for /f "tokens=*" %%i in ('findstr /i /e /l /c:"%%~nxa" "%~dp0所有文件.txt"') do (
  51.             set /a nb+=1
  52.             if !nb! gtr 1 (echo !str!&echo %%i&echo;)
  53.             set str=%%i
  54.         )
  55.         set nb=0
  56.     )
  57. )>>"%~dp0重复文件.txt"&echo ● !tj! 搜索:%%~na
  58. echo;
  59. start "" "%~dp0重复文件.txt"
  60. del /f /q "%~dp0所有名称.txt">nul 2>nul
  61. title 搜索完毕!处理结果!
  62. :VDFCure
  63. echo;
  64. echo;                  ******************
  65. echo;                  *   处 理 结 果  *
  66. echo;                  ******************
  67. echo; =============================================================================
  68. echo;    搜索开始时间:%tm%        
  69. echo;    搜索结束时间:%time%
  70. echo;    搜索文件总数:%tj%        
  71. echo     重复文件列表:%~dp0重复文件.txt
  72. echo; =============================================================================
  73. echo;
  74. echo;
  75. echo;                  ******************
  76. echo;                  *   结 果 处 理  *
  77. echo;                  ******************
  78. echo; =============================================================================
  79. echo;    1、改名:保留其中一个,在其它重复的文件名前面添加“重复_”或“New_重复_”;
  80. echo;             改名相当于给重复文件打标签,改名后可手动处理。
  81. echo;    2、转移:保留其中一个,将其它重复的文件转移到:%~dp0重复文件
  82. echo;             有多个重复时会被覆盖。
  83. echo;    3、删除:保留其中一个,将其余重复的文件全部删除,可能无法恢复;
  84. echo;             通常处理深层目录的而保留浅层目录的重复文件。
  85. echo;    0、返回上一层。
  86. echo; =============================================================================
  87. echo;    ●辨识文件名称与文件大小,不识别文件内容!请仔细检查,谨慎操作!●
  88. echo;
  89. set input=
  90. set /p input=    请输入序号:
  91. if "%input%"=="" goto VDFCure
  92. if %input%==0 (goto VDFStart) else (call :VDFCure1)
  93. cls
  94. goto VDFCure
  95. :VDFCure1
  96. cls
  97. set tm=%time%
  98. echo;
  99. echo;    开始处理,请稍后……
  100. echo;
  101. set a=
  102. set b=
  103. set n=0
  104. for /f "usebackq tokens=*" %%a in ("%~dp0重复文件.txt") do (
  105.     if not "!a!"=="" if /i  !a!==%%~na  if exist "%%~a" (
  106.        if exist "!b!" for /f "usebackq tokens=1*" %%m in ('!b!') do (
  107.           for /f "usebackq tokens=1*" %%o in ('%%~a') do if /i %%m==%%o if /i  %%n==%%p (
  108.              set /a n+=1
  109.              if %input%==1  (
  110.                 if exist "%%~dpa重复_%%~nxa"  (ren "%%~a" "New_重复_%%~nxa") else (ren "%%~a" "重复_%%~nxa")
  111.              )  
  112.              if %input%==2  (
  113.                 if not exist "%~dp0重复文件" md "%~dp0重复文件"
  114.                 move /y "%%~a" "%~dp0重复文件"
  115.              )  
  116.              if %input%==3  (del /q /f /s "%%~a")
  117.           )
  118.        )  
  119.     )  
  120.     set "a=%%~na"&set "b=%%~a"
  121. )
  122. echo;
  123. echo;                  ******************
  124. echo;                  *   处 理 结 果  *
  125. echo;                  ******************
  126. echo; =============================================================================
  127. echo;    处理开始时间:%tm%        
  128. echo;    处理结束时间:%time%
  129. echo;    处理文件总数:!n!        
  130. echo; =============================================================================
  131. echo;
  132. pause
  133. goto :eof
复制代码

作者: tmplinshi    时间: 2011-6-23 21:58

本帖最后由 tmplinshi 于 2011-6-23 22:08 编辑

试试 finddupe

finddupe 查找重复文件的方式:
Finddupe will only read the first 32k of a file and compute a hash based on that. Only if that matches with another file will it even read the entire files.

作者: cjiabing    时间: 2011-6-23 22:14

2# tmplinshi
我发现你经常冒出这些英文的东东,佩服佩服@!
不过这个东西没有中文说明,我看起来似乎不好用。
作者: Hello123World    时间: 2011-6-24 15:32

英文的东东好,计算机技术大师级的人物大都是英语种——不服不行。
作者: neorobin    时间: 2011-6-24 18:41

重复文件查找清理工具_NoClone(无双) 4.2.27.0 多国语言企业注册版
作者: qzwqzw    时间: 2011-6-29 22:05

一般用Duplicate Cleaner
免费+开源的产品
而且对NTFS hardlink的支持也比较好
作者: cjiabing    时间: 2011-7-5 10:06

呵呵,大家的秘密武器真多啊,谢谢了!~
作者: 523066680    时间: 2011-7-5 10:16

以前想过挑战一下 :查找重复的目录 (里面的文件相同)
作者: cjiabing    时间: 2011-7-5 11:01

8# 523066680
作者: CrLf    时间: 2011-7-5 19:02

8# 523066680


这题很有意思,何不发在挑战区,肯定够格了的
作者: qzwqzw    时间: 2011-7-7 18:36

10# zm900612
以前发过一个类似的挑战题目
主要为了解决市面上同步软件无法同步目录树改名的问题
有兴趣可以试试看

求解文件树智能同步批处理程序
http://www.bathome.net/thread-6928-1-2.html
作者: CrLf    时间: 2011-7-7 23:32

如果文件名不含等号的话,可以这样:
  1. @echo off&setlocal enabledelayedexpansion
  2. set qz=重复_@
  3. for /l %%a in (1 1 100) do set qz=new_!qz!
  4. for /f "delims=" %%a in ('dir /s /a-d /b *.mp3') do (
  5.     if defined %%~za%%~na ren "%%a" "!qz:~-%%a,-1!%%~nxa"
  6.     set /a "%%~za%%~na+=4"
  7. )
复制代码
不过文件一多效率就恶心了...




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