中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-12 06:39
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【出题】30万文件快速替换 查看 3,107 回复 21
楼 主 【出题】30万文件快速替换 发表于 2010-03-02 23:59 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
手上现在有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代码:
@echo off&setlocal enabledelayedexpansion
md test&cd test
echo 正在生产测试文件。。。
for /l %%a in (1 1 2000)do (
(echo ^<html^>
echo ...!random!...
echo ^<... http://mm.aa88567.cn/ ... ^>
)>!random!!time:~-2!!random!.htm
)

for /l %%a in (1 1 3000)do (
(echo ^<html^>
echo ...!random!...
echo dfddfd
)>!random!!time:~-2!!random!!time:~-2!.html
)

set ff=!random!
md %ff%

for /l %%a in (1 1 2000)do (
(echo ^<html^>
echo ...!random!...
echo ^<... http://mm.aa88567.cn/ ... ^>
)>%ff%\!random!!time:~-2!!random!.htm
)

for /l %%a in (1 1 3000)do (
(echo ^<html^>
echo ...!random!...
echo dfddfd
)>%ff%\!random!!time:~-2!!random!!time:~-2!.html
)


[ Last edited by plp626 on 2010-3-4 at 23:00 ]
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2 发表于 2010-03-03 01:46 ·  中国 广东 韶关 电信
高级用户
★★★
CMD感染者
积分 691
发帖 383
注册 2008-05-23 00:38
18年会员
UID 119451
性别 男
状态 离线
WIN32的要吗
速度未知
附件
20100303013116751.png
3 发表于 2010-03-03 02:19 ·  中国 广东 佛山 南海区 电信
初级用户
积分 30
发帖 19
注册 2009-04-04 03:50
17年会员
UID 142065
性别 男
状态 离线
试试
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 发表于 2010-03-03 04:36 ·  美国 惠普HP
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线

sed -i "/mm\.aa88567\.cn/d" *.html
5 发表于 2010-03-03 14:34 ·  中国 广东 深圳 电信
新手上路
积分 13
发帖 7
注册 2008-07-18 06:21
18年会员
UID 121666
性别 男
状态 离线
看了下 不简单 只能帮顶了。
6 发表于 2010-03-03 15:09 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
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 ]
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
7 发表于 2010-03-03 16:06 ·  中国 上海 联通
初级用户
积分 33
发帖 32
注册 2006-02-21 23:08
20年会员
UID 50740
性别 男
状态 离线
直接sed速度最快,不要用通过for, for的效率是最低的。 频繁开启&结束sed进程,对系统资源也是极大消耗,估计用不了多久cpu / mem 就out了。

还有,300,000 文件挨个处理速度不会太快的,毕竟牵扯到磁盘操作,不像是在内存里做计算类任务。
8 发表于 2010-03-03 16:10 ·  中国 上海 联通
初级用户
积分 33
发帖 32
注册 2006-02-21 23:08
20年会员
UID 50740
性别 男
状态 离线
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 发表于 2010-03-03 16:41 ·  中国 浙江 温州 苍南县 电信
初级用户
★★
积分 58
发帖 60
注册 2009-02-18 12:48
17年会员
UID 139163
性别 男
状态 离线
现在的内存都很大.
安装个ramdisk .把文件弄到ramdisk 盘中再用批处理. 它的小文件存取速度是非常惊人的. 相对于在内存中执行一样了.
10 发表于 2010-03-03 17:19 ·  中国 广东 佛山 南海区 电信
初级用户
积分 30
发帖 19
注册 2009-04-04 03:50
17年会员
UID 142065
性别 男
状态 离线
直接 *.html的话,通配符匹配到的文件都是以参数形式传递给sed来执行的,所以不能超出某个量数
—— 如果你在shell下这样用sed的话,就会出现

-bash: /bin/sed: Argument list too long

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

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

[ Last edited by Pierre on 2010-3-3 at 17:20 ]
11 发表于 2010-03-03 17:27 ·  中国 广东 佛山 南海区 电信
初级用户
积分 30
发帖 19
注册 2009-04-04 03:50
17年会员
UID 142065
性别 男
状态 离线
或者,直接用perl处理,让它循环处理
可惜用得不熟,迟点试着写个解决看看罢。。。
12 发表于 2010-03-03 20:42 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
我对perl也不怎么懂,还真希望有某高人能用一楼提供的perl来试试,

期待中。。。。。
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
13 发表于 2010-03-04 16:19 ·  中国 湖北 黄石 电信
中级用户
★★
积分 330
发帖 244
注册 2006-04-14 14:07
20年会员
UID 53823
性别 男
来自 湖北
状态 离线
贴个自已用的JS文件替换代码,按楼主的要求修改了下。


if(WScript.arguments.length==0)PathSpec=get_path();
else PathSpec=WScript.arguments(0);
fso=new ActiveXObject("Scripting.FileSystemObject");
WshShell=WScript.CreateObject("WScript.Shell");
WshShell.CurrentDirectory=fso.GetParentFolderName(WScript.ScriptFullName);
if(!fso.FolderExists("#ReplacedFiles#"))fso.CreateFolder("#ReplacedFiles#");
WshShell.CurrentDirectory="#ReplacedFiles#"
Main(PathSpec);
WScript.quit();

function Main(FileSpec){
var fld,fs,fds,f,fd,curdir;
curdir=fso.GetBaseName(FileSpec);
if(!fso.FolderExists(curdir))fso.CreateFolder(curdir);
curdir=fso.GetAbsolutePathName(curdir);
WshShell.CurrentDirectory=curdir;
fld = fso.getfolder(FileSpec);
fds = new Enumerator(fld.subfolders);
fs = new Enumerator(fld.files)
for(;!fs.atEnd();fs.moveNext()){
f=fs.item();if(f.size==0)continue;
if(/^html?$/gi.test(fso.getextensionname(f.name).toLowerCase())){
try{
var fl=fso.opentextfile(f.path,1);
var sss=fl.readall();
fl.close();
}catch(err){
WScript.quit();
}
var fl=fso.opentextfile(fso.GetBaseName(f.path)+".txt",2,true);
sss=sss.replace(/.*mm\.aa88567\.cn.*\s*$/,"");
fl.write(sss);
fl.close();
}
}
for(;!fds.atEnd();fds.moveNext()){
d=fds.item();
Main(d.path)
WshShell.CurrentDirectory=curdir
}
}


function get_path(){
var objShell = new ActiveXObject("Shell.Application")
do{
var objFolder = objShell.BrowseForFolder(0, "请选择文件夹:",0x301,0x11)
if(objFolder == null)WScript.quit()
var objPath = objFolder.Self.Path;
if(/^:\\.+$/gi.test(objPath))break;
}while(true)
return objPath;
}
14 发表于 2010-03-04 20:18 ·  中国 湖北 黄石 电信
中级用户
★★
积分 330
发帖 244
注册 2006-04-14 14:07
20年会员
UID 53823
性别 男
来自 湖北
状态 离线
再来一段AHK脚本


FileSelectFolder, sPath ,,3,请选择你要处理的文件夹:
if not %errorlevel%
{
IfNotExist,%sPath%_BAK
{
MsgBox,4,,没有发现备份,是否创建备份?
IfMsgBox Yes
{
TrayTip,,正在创建备份 ……,5
FileCopyDir %sPath% , %sPath%_BAK
}
}
Loop, %sPath%\*.html, , 1 ; Recurse into subfolders.
{
FileRead, sText, %A_LoopFileFullPath%
sss := RegExReplace( sText ,".*mm\.aa88567\.cn.*\s$", "")
FileDelete %A_LoopFileFullPath%
FileAppend %sss%, %A_LoopFileFullPath%
}

}

loop 2
{
soundBeep 2500,500
sleep 500
}

15 发表于 2010-03-04 21:23 ·  中国 陕西 西安 电信
银牌会员
★★★★
钻石会员
积分 2,278
发帖 1,020
注册 2007-11-19 13:34
18年会员
UID 103127
性别 男
状态 离线
13楼的代码试了下,速度那时没的说,只是,文件的后缀名统一被改为txt了,那些网页文件,索引的后缀是html,非索引的是htm,

对js不懂,你的代码后缀名不变的情形如何修改?
山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
论坛跳转: