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

[文件操作] [已解决]批处理怎样靠CRC32校验来删除文件?

0000aaca  3337424.pdf
0000b4be  2276006.pdf
0000b4c3  2490533.pdf
0000b4c3  543543543543534-----2917205.pdf
0000b9b0  1495391.pdf
0000bf34  2377773.pdf
0000bf34  567676868678-----3015760.pdf

在F盘根目录下有个AA文件夹  里面有300多万个文件  我建了一个文本文件 按照左边是CRC32校验码  右边是文件名的格式

想把左边CRC32校验码是一样的重复文件 提取出来 只保留一组
比如
0000bf34  2377773.pdf
0000bf34  567676868678-----3015760.pdf
这2组 0000bf34出现2次 说明这2个文件是重复的   删除其中一个文件到回收站  千万别彻底删除了 文件我还有用

需要注意的是  文本文件只有CRC校验码和文件名 并没有路径  只能保证文件名不出现重复 文件夹下还有N多的子文件夹

请会的朋友帮忙 谢谢~
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  1. @echo off
  2. md newfolder 2>nul
  3. set "crc32sum=%~dp0crc32sum.exe"
  4. set "#tmp=%~dp0#tmp"
  5. cd /d D:\aa
  6. (for /f "delims=" %%i in ('dir /b/a-d') do (
  7.    %crc32sum% %%i
  8. ))>%#tmp%
  9. for /f "tokens=1,2" %%i in (%#tmp%) do (
  10.   if not defined %%j (
  11.     set %%j=flag
  12.     copy /y "%%i" "%~dp0newfolder"
  13.   )
  14. )
  15. del "%#tmp%" /q
  16. start %~dp0newfolder
  17. pause
复制代码
需要工具crc32sum.exe

http://code.kliu.org/misc/hashutils/

TOP

回复 2# ShadowFiend


    楼主要求删除到回收站

TOP

回复 3# BAT-VBS
    大概那个意思就行了,那么死板干嘛
nevermore

TOP

回复 4# ShadowFiend


    这个需要问楼主
删除其中一个文件到回收站  千万别彻底删除了 文件我还有用

TOP

回复 4# ShadowFiend
回复楼主  你这个批处理貌似从新校验CRC32   我文件有将近300万个  时间太长了

再说 我已经校验好了
0000aaca  3337424.pdf
0000aaca就是3337424.pdf CRC32校验码
我已经放到了一个文本文件里  现在就是要处理这个文本文件

关键就是这个文本文件没有路径 不好删除
我的愿望是先处理这个文本文件  得到重复的文件名  然后遍历文件夹 去删除同名的文件

TOP

回复 6# necnec1


     子文件夹有重名的你也删?300万个文件确认没有重名的?
nevermore

TOP

文件名我已经重命名过了 基本可以排除有重名
就是子文件夹有点多

TOP

回复 6# necnec1
  1. @echo off
  2. for /f "tokens=1-2" %%a in (a.txt) do (
  3.     if not defined _%%a (
  4.         set _%%a=1
  5.     ) else (
  6.         echo 删除%%b
  7.     )
  8. )
  9. pause
复制代码
是这个意思吗?

TOP

楼上的代码有那么点意思了  不过还有点问题
删除的内容只在CMD窗口下显示  不能写入到文件
干脆直接把重复的那一行直接删除吧
反正CRC32的校验码都是固定的前8位  只要前8位字符是一样的  重复的行都删除 只保留一行就行了

TOP

现在的问题是你那些文件不是在同一目录下,这个是比较困难和耗时的部分。
我的想法是:先将要删除的文件名输出到一个文本a.txt,再将所有文件的完整路径输出到一个文本b.txt,然后用findstr根据这两个文件将需要删除的文件的完整路径取到另一个文本c.txt,最后用for/f循环删除所有需要删除的文件,虽然在多数情况下,临时文件是不推荐的,但这种情况下用临时文件应该是比较好的方式。
  1. @echo off
  2. ::将下一行的crc32.txt替换为实际的文件名
  3. (for /f "tokens=1*" %%a in (crc32.txt) do (
  4.   if defined %%a (echo,%%b) else set %%a=1
  5. ))>a.txt
  6. dir /s /b /a-d>b.txt
  7. findstr /i /g:a.txt b.txt>c.txt
  8. for /f "delims=" %%a in (c.txt) do del /a "%%a"
  9. del a.txt b.txt c.txt
复制代码
将crc32的校验结果文件和本bat文件一起放到要处理的文件夹的顶层目录,然后运行这个批处理即可。

必须满足:
1.校验结果文件格式要工整,每一行第一列必须为校验码,空格或tab后为文件名;
2.任何子目录不能取名为校验结果文件中的任何一个文件名;
看得多说得多,远比不上写得多。

TOP

回复 10# necnec1


加个简单的重定向就行了,这是基础知识。
  1. @echo off
  2. for /f "tokens=1-2" %%a in (a.txt) do (
  3.     if not defined _%%a (
  4.         set _%%a=1
  5.     ) else (
  6.         >>b.txt echo 删除%%b
  7.     )
  8. )
  9. pause
复制代码

TOP

回复 11# weichenxiehou


这么简单的问题是不用临时文件滴
  1. @echo off
  2. for /f "tokens=1-2" %%a in (a.txt) do (
  3.     if not defined _%%a (
  4.         set _%%a=1
  5.     ) else (
  6.         for /f "delims=" %%h in ('dir /s /b /a-d %%b') do (
  7.             del /f /a "%%h"
  8.         )
  9.     )
  10. )
复制代码

TOP

回复 13# BAT-VBS
如果文件名中有空格怎么办?每一行都dir /s,300万个文件,你可以去试试效率,写批处理并不仅仅是能够实现就好,还需要考虑效率和特殊情况滴。
看得多说得多,远比不上写得多。

TOP

回复 14# weichenxiehou


    只有重复的行才会dir /s,至于到底哪个效率高,就只能等楼主的测试结果了。

TOP

返回列表