[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

回复 42# BAT-VBS
“他”是指谁?namejm?我用的win7,难道xp下面必须要在最后加空行,不知,我最开始用电脑就是从win7开始的。
看得多说得多,远比不上写得多。

TOP

回复 41# weichenxiehou


    是不是你用的操作系统跟他的不一样啊?是XP吗,还是Win7啊?

TOP

本帖最后由 weichenxiehou 于 2012-12-4 20:46 编辑

回复 37# necnec1
我估计是因为用set定义了太多的变量,后面用if defined在如此之多的变量里面查找会比较吃力,可以先用sort排序,然后用一个变量来比较。
  1. @echo off&setlocal enabledelayedexpansion
  2. md backup 2>nul
  3. ::将下一行的crc32.txt替换为实际的文件名
  4. (for /f "tokens=1*" %%a in ('sort crc32.txt') do (
  5.   if %%a=="!str!" (echo,\%%b)
  6.   set "str=%%a"
  7. ))>a.txt
  8. dir /s /b /a-d>b.txt
  9. findstr /ile /g:a.txt b.txt>c.txt
  10. for /f "delims=" %%a in (c.txt) do  move /y "%%a" backup\
  11. del a.txt b.txt c.txt
复制代码
亲测,a.txt不额外加一空行不会出现jm说的最后一行不会当成搜索字符串的问题。
看得多说得多,远比不上写得多。

TOP

回复 36# cjiabing


    从37楼来看,不是内存问题。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 37# necnec1


    不要双击运行。打开一个CMD窗口,去运行那个bat文件,看看报错信息是什么。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

我现在是这么一个想法
文本文件A 内容如下
3eb27c6f  8026844.pdf
e259ce1a  8026845.pdf
e259ce1a  8026644.pdf
d85ec019  8026847.pdf
e84f9de0  8026848.pdf
我再弄一个文本文件B   将所有PDF的完整路径和名称用Everything导出来

用文本文件A 和文本文件B去做比较  得出重复文件的完整路径和名称  然后转移保存到文件夹 岂不是更快

TOP

weichenxiehou最后的代码 出现了和BAT-VBS 类似的瓶颈   都是6个多小时查找到6万左右 跑起来相当费力  CPU占用50% 内存只耗费不到19M  感觉不像是内存的问题 我是2G的内存 5300的U  应该还凑合吧
是不是CMD本身的限制
namejm 版主改写的批处理貌似运行了一闪而过  只有一个backup文件夹 里面没东西 软件也下了 是哪有问题?

TOP

回复 35# Batcher


    你显然不知道我回答问题的出发点在那里,我针对的是26楼说的情况,而非29楼和30楼。楼主这么说:
BAT-VBS 你的批处理 我从中午12点半开始 到下午的6点半 执行了大概6万左右
刚开始速度还没到那种无法忍受的地步 到后来 几乎是越执行越慢 到6点半 果断放弃
如果20万的重复量的话 不知道1天跑不跑的完
为什么执行的效率越来越差?我不是从代码执行效率来说的,而仅仅是从电脑使用操作的角度来说的。我只能简单地说内存资源耗尽了,空间不足了,你真要我说个子丑寅卯来我也无能为力了,因为我非计算机专业,仅能从我十年使用电脑的经验做出这样粗浅的判断。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 32# cjiabing


    你可以分别针对29楼和30楼的代码分析一下,看看哪里会导致空间(假设你指的是内存)问题。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 31# weichenxiehou
如果只用findstr来做的话,还是需要对a.txt做特殊处理
比如在生成a.txt的时候,在每行行首都添加反斜杠 \
另外,还要给 findstr 添加 /e 参数
这样才能保证获取的字符串被限定在完整路径的最后一层,且等于最后一层的字符串
还需要特别注意的是,在 findstr 之前需要要在a.txt的最后一行添加一个空行
以防止 findstr /e 时不能获取到 a.txt 中的最后一行非空字符串
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

呵呵,如果真要提高效率的话
还是建议从获取校验码的那一步做起
用专门的命令行工具来生成含绝对路径的校验文件
剩下的事情就是对生成的校验文件根据验证码进行处理了
可以用专门的命令行工具filemd5.exe或fsum.exe来生成带绝对路径的校验码文件
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

300万的文件要累死机器,刚开始很快,后面空间不足了当然慢了,如果有必要可以分成几部分处理。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 29# namejm
传说中的前站长namejm居然现身了,罕见罕见!jm一向以严谨著称,见识了。。。
要规避findstr搜索字符串的特殊字符,是不是可以用/l参数?一个文件名包含在另一个文件名中的情况确实需要考虑,惭愧惭愧。。。
  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 /il /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
复制代码
看得多说得多,远比不上写得多。

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

返回列表