中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 删除D盘下文件夹名为数字(0-999999)下的影音文件
« [1] [2] »
作者:
标题: 删除D盘下文件夹名为数字(0-999999)下的影音文件 上一主题 | 下一主题
tide2046
新手上路





积分 18
发帖 7
注册 2006-9-26
状态 离线
『第 16 楼』:  

那我想在删除前把这些文件备份,包括目录结构,和里面所有的文件

也就是说

比如 删除D:/music/123/*.rm   就把123文件夹里所有的文件  和 目录结构一起备份

如果能把music文件夹整个备份当然更好


请兄赐教啊

2006-9-28 21:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
NaturalJ0
银牌会员




积分 1181
发帖 533
注册 2006-8-14
状态 离线
『第 17 楼』:  

备份就用鼠标吧

2006-9-28 21:48
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 18 楼』:  



  Quote:
Originally posted by tide2046 at 2006-9-28 21:41:
那我想在删除前把这些文件备份,包括目录结构,和里面所有的文件

也就是说

比如 删除D:/music/123/*.rm   就把123文件夹里所有的文件  和 目录结构 ...

楼上说的对, 你备份就在Windows 下吧, 用cmd会很麻烦,  昨天整了一个晚上, 挺累的, 休息去了.

2006-9-28 22:52
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 19 楼』:  



  Quote:
Originally posted by pengfei at 2006-9-28 07:02:
在14楼代码的基础上修改, 完全抛开了13楼与14楼中的正则表达式用法. 因此速度得到大幅度提升,  另外一个优点是可以匹配非纯数字目录(慎用!).  经过浠...

  通过截取字符来判断的方法确实不错,比 echo|findstr 效率高多了,赞一个先。

  下一步可以考虑路径带空格的问题,呵呵。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-9-28 22:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 20 楼』:  



  Quote:
Originally posted by namejm at 2006-9-28 22:53:

  通过截取字符来判断的方法确实不错,比 echo|findstr 效率高多了,赞一个先。

  下一步可以考虑路径带空格的问题,呵呵。

呵呵~ 我写批处理的很多思路来自C语言中的算法...

15, 16楼的代码已经可以处理带空格路径的文件夹了.

[ Last edited by pengfei on 2006-9-28 at 23:06 ]

2006-9-28 23:03
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 21 楼』:  

Part 1:

  Quote:

@echo off
    set strOldDir=%cd%
    set strRegExp=".*\\[0-9]*\\[0-9]*$"
rem set strRegExp=".*\\[0-9]*$"
    set strFileExtension=*.wmv *.rm *.rmvb *.avi *.mp3 *.wma *.wav
    for /f "delims=" %%i in ('dir /ad /s /b ^| findstr /rc:%strRegExp%') do cd "%%i" && echo %%i && dir /b %strFileExtension%
rem for /f "delims=" %%i in ('dir /ad /s /b ^| findstr /rc:%strRegExp%') do cd "%%i" && del %strFileExtension%
    cd %strOldDir%
pause
注意事项:
1.此脚本为演示效果,若要删除影音文件,可以把第二个for语句前面的rem移到第一个for语句之前。
2.若要添加备份目录功能,可以直接用xcopy在for语句里面自行添加。
3.默认目录格式若: x:\xxx\数字\数字\影音文件(如要包括子目录可在for语句中的del/dir命令后加上/s参数),如果移动第四行前面的rem到第三行行首,则默认目录格式若: x:\xxx\数字\影音文件
4.以上代码均未测试。

Part 2:

  Quote:
关于回贴中提到的不用findstr的方法的两点想法:
1.关于获得最后两个目录
for ..... do (
    set "strDir="%%i""
    set "strDir=!strDir:\=" "!"
    for %%? in (!strDir!) do strTmp=%%? !strTmp!
    call :dosomething !strTmp!
)
....

:dosomething
    rem 在这个标号段中只需要对%1和%2做判断就可以了。
    rem %1对应最低层子目录,%2为%1的父目录。
goto :eof
2.关于判断目录是否全为数字:
:IsNumber
    set "strNum=%~1%~2"
    for /l %%i in (0,1,9) do set "strNum=!strNum:%%i=!"
    if "%strNum%" == "" echo 全数字!
goto :eof
注意:以上代码均未测试。



2006-9-29 01:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 22 楼』:  

3742668版主对语句和参数的使用好强, 代码简洁高效, 思路独到. 值得我们很好地学习...

而我对find和findstr两个命令一直有点畏惧, 它们的执行效率是比较低的, 尤其处理的数据量大的时候速度比较慢. 这一点我是经过大量测试得出来的.

版主对findstr提的两点建议很有道理, 特别是第二点思路很好.

另外版主的代码好像都只考虑目录数最多为两个(不知道是不是我看错了), 如果目录数更多就需要改写. 我还是觉得把需要操作的根目录下的所有目录列出来判断是否全为数字要好, 而用正则表达式判断是否全为数字也会影响速度.

用版主的这一段就很好, 所以我还是坚持不使用findstr:
:IsNumber
    set "strNum=%~1%~2"
    for /l %%i in (0,1,9) do set "strNum=!strNum:%%i=!"
    if "%strNum%" == "" echo 全数字!
goto :eof

感谢3742668的精彩点评, 学习了~~~!

[ Last edited by pengfei on 2006-9-30 at 10:06 ]

2006-9-30 10:01
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
kmlxk
初级用户





积分 45
发帖 17
注册 2006-9-23
状态 离线
『第 23 楼』:  

仰视一下~~强人啊

2006-9-30 11:13
查看资料  发送邮件  发短消息 网志  OICQ (86565242)  编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 24 楼』:  

Re pengfei:
1.关于用findstr效率低的问题。
    同样是用findstr,但是循环内和循环外使用的效率截然不同。你所说的效率低,是因为你把它放在循环内使用,执行的次数多了,当然效率就低了。如果放在循环外面执行,可以大胆地说,绝对比你写代码自己完成相应功能要快得多。
2.关于只能处理两层目录的问题。
     提示一下:for %%? in (!strDir!) do strTmp=%%? !strTmp!执行后,如果路径为c:\111\222\333\444,则strTmp的内容会是:"444" "333" "222" "111" c:"

2006-9-30 12:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 25 楼』:  



  Quote:
Originally posted by 3742668 at 2006-9-29 01:49:
@echo off
    set strOldDir=%cd%
    set strRegExp=".*\\[0-9]*\\[0-9]*$"
rem set strRegExp=".*\\[0-9]*$"
    set strFileExtension=*.wmv *.rm *.rmvb *.avi *.mp3 *.wma *.wav
    for /f "delims=" %%i in ('dir /ad /s /b ^| findstr /rc:%strRegExp%') do cd "%%i" && echo %%i && dir /b %strFileExtension%
rem for /f "delims=" %%i in ('dir /ad /s /b ^| findstr /rc:%strRegExp%') do cd "%%i" && del %strFileExtension%
    cd %strOldDir%
pause

这段代码效率非常高, 比13楼和14楼代码的执行效率高许多, 比15楼的代码也要快.

3742668版主能解释一下 findstr /rc:".*\\[0-9]*\\[0-9]*$" 这一句的含意吗?

这一段代码的大概意思是不是列出当前目录下所有的子目录, 判断最底层目录是否全为数字, 如果是将删除文件夹下的所有影音文件?

如果是这样就不符合楼主提出的. d:\music\1234\1345 (当前目录为d盘), 只要目录名不为数字这样的文件夹下的文件都不能删.

所以还是列出当前目录下所有的文件夹名, 判断其是否全为数字, 如果路径中出现非数字就不执行删除操作要安全一些.

[ Last edited by pengfei on 2006-10-1 at 03:55 ]

2006-10-1 03:44
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
3742668
荣誉版主





积分 2013
发帖 718
注册 2006-2-18
状态 离线
『第 26 楼』:  

Re pengfei:
    1.findstr /rc:".*\\[0-9]*\\[0-9]*$"表示搜索字符串的内容为:[任意内容]+[\]+[至少一个数字]+[\]+[至少一个数字][结束],在findstr的搜索字符中,遇到特殊字符需要用\来转义,例如\就应该写成:\\
    2.这段代码的作用是,如果当前目录下的子目录中,最后两层目录为全数字组成的话,则删除最底层目录下所有的影音文件。
    3.很显然,你和我对于楼主(这个可耻的家伙,咱为他争得脸红脖子粗,他给咱玩失踪,呵呵)的意图理解并不一样。
    你的理解为:最低两层全数字,且父目录中也是全数字(拗口,也就是当前目录下的每层子目录都全数字)。
    而我的理解为:最低两层全数字,父目录不管。
    不过,不管楼主的意图是什么,都不重要。但是,对于你所说的"所以还是列出当前目录下所有的文件夹名, 判断其是否全为数字,",个人觉得不是很必要:
1.findstr部分:
@echo off
    set strOldDir=%cd%
    set Filter="%cd:\=\\%\\[0-9]*\\[0-9]*$"
rem set Filter=".*\\[0-9]*\\[0-9]*$"
rem set Filter=".*\\[0-9]*$"
    set FileExtension=*.wmv *.rm *.rmvb *.avi *.mp3 *.wma *.wav
    set "cmd1=dir /ad /s /b ^| findstr /rc:"
    set "cmd2=cd "%%i" && echo %%i && dir /b"
    for /f "delims=" %%i in ('%cmd1%%Filter%') do %cmd2% %FileExtension%
    cd %strOldDir%
pause
2.非findstr部分:
for .... do (
    set "strPath=%%i"
    set "strPath=!strPath:*%cd%\=!"
    call :dosomething "!strPath:\="
    )
goto :eof

:dosomething
    rem 这里除了21F中过滤数字的代码以外
    rem 还需要对空格进行过滤
    rem 参数要用%~*而不是%~1%~2
goto :eof
   
纸上又谈了半天兵,闪人睡觉去也。

2006-10-1 12:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 27 楼』:  



  Quote:
Originally posted by tide2046 at 2006-9-28 05:34:
现在上司给的指示是:只能是父目录为数字的文件夹里的影音文件和其子目录名同样为数字的文件夹里的影音文件才可以删

即:比如 D:/music/123/*.rm   这样的不能删

而:D:3213/321/*.rm   这样的需要删除

呵呵~ 楼主潜水这么久也不冒个泡.

我对他上面给出的提示的理解是, D盘根目录下的music文件夹下的文件不能删, 而music目录下又出现了数字命名的文件夹. 这样3742668版主从最底层目录匹配纯数字是危险的, music目录下的123文件夹符合条件, 而提示是这样的目录下的文件不能删.

所以我认为从当前根目录开始匹配最为安全, 并且楼主提到只能是父目录为数字以及子目录同样为数字的文件夹里的影音文件才可以删.

3742668版主提示的还需要对空格进行过滤, 这个很重要. 我在想为什么你的代码执行这么快, 有点纳闷了, 而13楼namejm版主的代码和14楼的代码为同样的正则表达式却慢很多. (虽然findstr在FOR循环中, 但我认为不是这个原因)

21楼的findstr是dir /s 后接一个管道命令连接, 而13,14楼的代码是先dir /s 后进行处理再echo后接一个管道命令. 难道是这个原因???

2006-10-2 20:09
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
pengfei
银牌会员




积分 1218
发帖 485
注册 2006-7-21
来自 湖南.娄底
状态 离线
『第 28 楼』:  

CLS
不好意思, 我这网络真差, 刚连上就掉线了, 一连提交几次才成功, 一看居然提交了两次重复内容. 汗...
[ Last edited by pengfei on 2006-10-2 at 20:22 ]

2006-10-2 20:10
查看资料  发送邮件  发短消息 网志  OICQ (573381312)  编辑帖子  回复  引用回复
iPoint
初级用户





积分 22
发帖 26
注册 2009-12-8
状态 离线
『第 29 楼』:  



  Quote:
Originally posted by 3742668 at 2006-10-1 12:24:
Re pengfei:
    1.findstr /rc:".*\\[0-9]*\\[0-9]*$"表示搜索字符串的内容为:[任意内容]+[\]+[至少一个数字]+[\]+[至少一个数字][结束],在findstr的搜索字符中 ...

3742668這個版主還在嗎。。好仰慕。。收藏寶貼

2010-1-18 16:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: