[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
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
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

300万的PDF文件 数量巨大 本来想用查找重复的软件弄弄 结果动辄就要起码1天的时间  想想放弃了  想走点捷径 看看批处理 貌似没太好的办法 结果用了一个自己都觉得恶心的办法 用WINRAR来提取CRC32的校验码 300万的文件 用了6个小时 还凑合 基本符合预期 配合批处理我估计 应该很快
这些要谢谢BAT-VBS 和weichenxiehou 2个兄弟大力帮忙

TOP

weichenxiehou的代码 没敢用300万文件试 先用4000左右的文件测试 非常快 用他的批处理 几秒之内搞定 效率不错 打算今晚大规模用

TOP

BAT-VBS   你的批处理 我从中午12点半开始 到下午的6点半 执行了大概6万左右
刚开始速度还没到那种无法忍受的地步 到后来 几乎是越执行越慢 到6点半 果断放弃
如果20万的重复量的话  不知道1天跑不跑的完

TOP

回复 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

评分人数

看得多说得多,远比不上写得多。

TOP

回复 23# necnec1


    大概需要执行多长时间?

TOP

weichenxiehou  你那个批处理不错  就是能稍微改进一下  我刚测试了一下你的批处理 你那个文件删的没影了  能否删除到回收站  重复的文件我还要 还得比对一下

TOP

回复 19# necnec1


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

评分人数

TOP

好滴 帅哥 我试试

TOP

回复 19# necnec1
擦,lz要不要这么可爱,那些原理是解释我批处理代码的实际运作方式的,不关你的事啊,你不是有一个存放了校验码和文件名的文本吗,把那个crc32.txt改成那个文本的真实名字就可以了。
看得多说得多,远比不上写得多。

TOP

BAT-VBS  你这个批处理 我估计了一下 大概要5个小时 太猛了
半个小时 大概才整理出2万左右
我估算了一下 我这个好像总共有20万左右的重复文件

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

还有::将下一行的crc32.txt替换为实际的文件名 这一句  这个CRC32.TXT是个什么东西   和 A.TXT 是什么关系 要这个文件做什么?

TOP

回复 17# ShadowFiend


    在得到楼主的测试数据之前,都是瞎猜。

TOP

回复 11# weichenxiehou
    支持这种用法和用临时文件。300万不是小数目,考虑到效率问题,用临时文件是正确的选择。而不是所谓的"那么简单"
nevermore

TOP

回复 14# weichenxiehou


    空格的问题很容易,稍微改改就行了,一行代码都不用增加,看楼主的实际需求了。

TOP

回复 14# weichenxiehou


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

TOP

返回列表