中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-12 07:36
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行
DOS批处理 & 脚本技术(批处理室) » 【出题】30万文件快速替换
可打印版本  3,109 / 21
第1楼 plp626 发表于 2010-03-02 23:59
银牌会员 发帖 1,020 积分 2,278
【出题】30万文件快速替换
手上现在有30多万htm文件(还有少量的html),这些文件里有相当多的一部分挂马,发现这些挂马的html及htm源文件的最后一行含有mm.aa88567.cn这个网址,

现在,要找出那些挂马的网页(最后一行包含字符串"mm.aa88567.cn”),然后把它的最后一行删掉,

使用工具,windows 自带的常用工具,或者外部工具:perl,sed,。。。(体积大小不超过1M的皆可)

现在求处理速度最快的工具,及其方案(代码)

sed (40K 版本 4.0.7)下载: http://upload.cn-dos.net/img/1813.rar
perl(369K 版本 5.005_03) 下载: http://upload.cn-dos.net/img/1814.rar

下面是生产测试文件的bat代码:


[ Last edited by plp626 on 2010-3-4 at 23:00 ]
第2楼 radem 发表于 2010-03-03 01:46
高级用户 发帖 383 积分 691
WIN32的要吗
速度未知

附件
20100303013116751.png (2.68 KiB)
第3楼 Pierre 发表于 2010-03-03 02:19
初级用户 发帖 19 积分 30
试试
for /f "delims=" %%i in ('dir /s /b *.html') do sed -i "${/mm\.aa88567\.cn/d}" "%%i"

[ Last edited by Pierre on 2010-3-3 at 02:23 ]
第4楼 HAT 发表于 2010-03-03 04:36
版主 发帖 5,017 积分 9,023
第5楼 qq330878338 发表于 2010-03-03 14:34
新手上路 发帖 7 积分 13
看了下 不简单 只能帮顶了。
第6楼 plp626 发表于 2010-03-03 15:09
银牌会员 发帖 1,020 积分 2,278
4楼的代码应该是比较快的---- 相比3路没有频繁的启动sed
可是:

用1楼的bat代码生成测试文件在test目录内,于test父目录路径下打开cmd,键入 sed -i "/mm\.aa88567\.cn/d" test\*.html
后,不等几秒钟便出现sed什么内存不能为read的错误

貌似sed最多支持批量处理文件为512个,因为在目录生成了511个临时文件就弹出了这错误对话框,

不知何故,继续关注。。。。

[ Last edited by plp626 on 2010-3-3 at 15:11 ]
第7楼 tachyon 发表于 2010-03-03 16:06
初级用户 发帖 32 积分 33
直接sed速度最快,不要用通过for, for的效率是最低的。 频繁开启&结束sed进程,对系统资源也是极大消耗,估计用不了多久cpu / mem 就out了。

还有,300,000 文件挨个处理速度不会太快的,毕竟牵扯到磁盘操作,不像是在内存里做计算类任务。
第8楼 tachyon 发表于 2010-03-03 16:10
初级用户 发帖 32 积分 33
Originally posted by plp626 at 2010-3-3 15:09:
4楼的代码应该是比较快的---- 相比3路没有频繁的启动sed
可是:

用1楼的bat代码生成测试文件在test目录内,于test父目录路径下打开cmd,键入 sed -i &q ...


这个还是要看sed文档了,如果有同时编辑的文件数目限制,那可以先通过batch
把所有文件按数量划分到若干个目录,之后再依次对各个目录进行sed 处理。
第9楼 sady2009 发表于 2010-03-03 16:41
初级用户 发帖 60 积分 58
现在的内存都很大.
安装个ramdisk .把文件弄到ramdisk 盘中再用批处理. 它的小文件存取速度是非常惊人的. 相对于在内存中执行一样了.
第10楼 Pierre 发表于 2010-03-03 17:19
初级用户 发帖 19 积分 30
直接 *.html的话,通配符匹配到的文件都是以参数形式传递给sed来执行的,所以不能超出某个量数
—— 如果你在shell下这样用sed的话,就会出现

这样的错误
当然,不仅仅是sed这样, awk/grep 等均有此待遇

如果想效率再高点的话,可以切割列表,500个一次送给sed处理

[ Last edited by Pierre on 2010-3-3 at 17:20 ]
第11楼 Pierre 发表于 2010-03-03 17:27
初级用户 发帖 19 积分 30
或者,直接用perl处理,让它循环处理
可惜用得不熟,迟点试着写个解决看看罢。。。
第12楼 plp626 发表于 2010-03-03 20:42
银牌会员 发帖 1,020 积分 2,278
我对perl也不怎么懂,还真希望有某高人能用一楼提供的perl来试试,

期待中。。。。。
第13楼 freeants001 发表于 2010-03-04 16:19
中级用户 发帖 244 积分 330 来自 湖北
贴个自已用的JS文件替换代码,按楼主的要求修改了下。

第14楼 freeants001 发表于 2010-03-04 20:18
中级用户 发帖 244 积分 330 来自 湖北
再来一段AHK脚本

第15楼 plp626 发表于 2010-03-04 21:23
银牌会员 发帖 1,020 积分 2,278
13楼的代码试了下,速度那时没的说,只是,文件的后缀名统一被改为txt了,那些网页文件,索引的后缀是html,非索引的是htm,

对js不懂,你的代码后缀名不变的情形如何修改?
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023