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


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

TOP

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

TOP

回复 17# ShadowFiend


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

TOP

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

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

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

TOP

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

TOP

好滴 帅哥 我试试

TOP

回复 19# necnec1


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

评分人数

TOP

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

TOP

回复 23# necnec1


    大概需要执行多长时间?

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

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

TOP

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

TOP

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

TOP

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

在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
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表