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

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

[复制链接]
发表于 2012-12-2 11:02:23 | 显示全部楼层
回复 14# weichenxiehou


    空格的问题很容易,稍微改改就行了,一行代码都不用增加,看楼主的实际需求了。
发表于 2012-12-2 11:52:51 | 显示全部楼层
回复 11# weichenxiehou
    支持这种用法和用临时文件。300万不是小数目,考虑到效率问题,用临时文件是正确的选择。而不是所谓的"那么简单"
发表于 2012-12-2 12:41:20 | 显示全部楼层
回复 17# ShadowFiend


    在得到楼主的测试数据之前,都是瞎猜。
 楼主| 发表于 2012-12-2 13:18:50 | 显示全部楼层
BAT-VBS  你这个批处理 我估计了一下 大概要5个小时 太猛了
半个小时 大概才整理出2万左右
我估算了一下 我这个好像总共有20万左右的重复文件

weichenxiehou 的办法貌似没办法进行   先将要删除的文件名输出到一个文本a.txt  我没有办法得到
再将所有文件的完整路径输出到一个文本b.txt  这个可以  我用Everything导出就可以了

还有::将下一行的crc32.txt替换为实际的文件名 这一句  这个CRC32.TXT是个什么东西   和 A.TXT 是什么关系 要这个文件做什么?
发表于 2012-12-2 13:39:02 | 显示全部楼层
回复 19# necnec1
擦,lz要不要这么可爱,那些原理是解释我批处理代码的实际运作方式的,不关你的事啊,你不是有一个存放了校验码和文件名的文本吗,把那个crc32.txt改成那个文本的真实名字就可以了。
 楼主| 发表于 2012-12-2 13:41:49 | 显示全部楼层
好滴 帅哥 我试试
发表于 2012-12-2 14:05:53 | 显示全部楼层
回复 19# necnec1


    好的,你先试试11楼的方案,如果仍然太慢的话,我再用另外一个思路帮你写代码。

评分

参与人数 1技术 +1 收起 理由
necnec1 + 1 热心助人

查看全部评分

 楼主| 发表于 2012-12-2 19:14:03 | 显示全部楼层
weichenxiehou  你那个批处理不错  就是能稍微改进一下  我刚测试了一下你的批处理 你那个文件删的没影了  能否删除到回收站  重复的文件我还要 还得比对一下
发表于 2012-12-2 20:32:35 | 显示全部楼层
回复 23# necnec1


    大概需要执行多长时间?
发表于 2012-12-2 20:55:29 | 显示全部楼层
回复 23# necnec1
何必删除到回收站那么麻烦,不同的系统回收站的路径还不一样,建立一个备份文件夹,把要删除的文件移动到这里不就行了。

  1. @echo off
  2. md backup 2>nul
  3. ::将下一行的crc32.txt替换为实际的文件名
  4. (for /f "tokens=1*" %%a in (crc32.txt) do (
  5.   if defined %%a (echo,%%b) else set %%a=1
  6. ))>a.txt
  7. dir /s /b /a-d>b.txt
  8. findstr /i /g:a.txt b.txt>c.txt
  9. for /f "delims=" %%a in (c.txt) do  move /y "%%a" backup\
  10. del a.txt b.txt c.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
necnec1 + 1 热心助人

查看全部评分

 楼主| 发表于 2012-12-2 21:01:18 | 显示全部楼层
BAT-VBS   你的批处理 我从中午12点半开始 到下午的6点半 执行了大概6万左右
刚开始速度还没到那种无法忍受的地步 到后来 几乎是越执行越慢 到6点半 果断放弃
如果20万的重复量的话  不知道1天跑不跑的完
 楼主| 发表于 2012-12-2 21:04:24 | 显示全部楼层
weichenxiehou的代码 没敢用300万文件试 先用4000左右的文件测试 非常快 用他的批处理 几秒之内搞定 效率不错 打算今晚大规模用
 楼主| 发表于 2012-12-2 21:10:33 | 显示全部楼层
300万的PDF文件 数量巨大 本来想用查找重复的软件弄弄 结果动辄就要起码1天的时间  想想放弃了  想走点捷径 看看批处理 貌似没太好的办法 结果用了一个自己都觉得恶心的办法 用WINRAR来提取CRC32的校验码 300万的文件 用了6个小时 还凑合 基本符合预期 配合批处理我估计 应该很快
这些要谢谢BAT-VBS 和weichenxiehou 2个兄弟大力帮忙
发表于 2012-12-2 22:11:52 | 显示全部楼层
25楼的代码大致能解决问题
但是,如果环境比较复杂的话,还是会误删文件的
问题出在这一句:

  1. findstr /i /g:a.txt b.txt>c.txt
复制代码
因为 findstr 是部分支持正则表达式的
用 /g:a.txt 从a.txt文件中获取到的字符串几乎每行都含有点号,而点号能匹配任意一个字符
形如 1.pdf 的名称是能和 1Xpdf 这样的字符串匹配的
当 b.txt 中字符串的组成规律足够复杂,出错的几率会很高
另外,从a.txt中获取到的字符串,findstr无法限定它们是否位于绝对路径的最后一层,并且不能限定之后是否包含其他字符
搜索 1.pdf 的时候,能匹配到 d:\test\11.pdf ,也能匹配到 d:\test1.pdf\a.pdf
所以,需要对a.txt中的字符串做进一步处理
当 findstr /g:a.txt 的时候,使得那些特殊字符失去正则意义而回归普通字符的含义,且能限定该字符串等于完整路径的最后一层
一个可行的办法是:
把 a.txt 中每行字符的点号用 \. 来替换,行首添加字符 ^ ,行尾添加字符$
需要用 gsed.exe 进行处理
在25楼的基础上修改如下:

  1. @echo off
  2. md backup 2>nul
  3. ::将下一行的crc32.txt替换为实际的文件名
  4. (for /f "tokens=1*" %%a in (crc32.txt) do (
  5.   if defined %%a (echo,%%b) else set %%a=1
  6. ))>a.txt
  7. gsed "s/\./\\./g;s/^/\\\\/;s/$/\$/" a.txt>b.txt
  8. dir /s /b /a-d>c.txt
  9. findstr /i /g:b.txt c.txt>d.txt
  10. for /f "delims=" %%a in (d.txt) do  move /y "%%a" backup\
  11. del a.txt b.txt c.txt d.txt
复制代码
gsed 可以去这里下载:http://www.bathome.net/thread-16975-1-1.html
发表于 2012-12-2 22:24:10 | 显示全部楼层
在29楼代码的基础上,改用gawk来判断重复文件,提高效率。
  1. @echo off
  2. md backup 2>nul
  3. ::将下一行的crc32.txt替换为实际的文件名
  4. gawk "{a[$1]++;if(a[$1]>1)print $2}" crc32.txt >a.txt
  5. gsed "s/\./\\./g;s/^/\\\\/;s/$/\$/" a.txt>b.txt
  6. dir /s /b /a-d>c.txt
  7. findstr /i /g:b.txt c.txt>d.txt
  8. for /f "delims=" %%a in (d.txt) do  move /y "%%a" backup\
  9. del a.txt b.txt c.txt d.txt
复制代码
gsed 可以去这里下载:http://www.bathome.net/thread-16975-1-1.html
gawk 可以去这里下载:http://www.bathome.net/thread-1114-1-1.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-19 20:35 , Processed in 0.017729 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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