Board logo

标题: 请问如何把目录下所有不在过虑列表文件中的文件删除? [打印本页]

作者: dejoy     时间: 2008-11-9 01:58    标题: 请问如何把目录下所有不在过虑列表文件中的文件删除?

有一个目录,结构如下:
.
└─GExperts
    ├─ExternalSource
    │  ├─Abbrevia
    │  └─UniSynEdit
    ├─Images
    └─Source
        ├─BackupProject
        ├─ClassBrowser
        ├─ClipboardHistory
        ├─CodeLibrarian
        ├─CodeProofreader
        ├─Editor
        ├─EditorToolbar
        ├─Experts
        ├─FavoriteFiles
        ├─Framework
        ├─Grep
        ├─IDE
        ├─IDEDocking
        │  └─Sample
        ├─MacroLibrary
        ├─MacroTemplates
        ├─MessageDialog
        ├─OpenFile
        ├─ProcedureList
        ├─ProjectDependencies
        ├─ProjectOptionSets
        ├─RenameComponents
        ├─ReplaceComponents
        ├─SampleExperts
        ├─SetComponentProperties
        ├─SourceExport
        ├─StandAlone
        │  ├─CodeLibrarian
        │  ├─DebugWindow
        │  ├─ExpertManager
        │  └─Grep
        ├─ToDoList
        └─Utils
目录里面包含完整的文件,现在想把不包含在一个已知过滤列表文件Filter.txt中的文件剔除掉(可以直接删除,但为了对比有那些被过滤,所以最好在原文件名后加'_',如xxx.pas不在filter.txt中,则重命名为xxx.pas_),需要处理所有子目录中文件.请问应该如何写BAT?

过滤列表文件Filter.txt内容如下:
AbArcTyp.pas
AbConst.pas           
AbDfBase.pas           
AbDfCryS.pas            
AbDfEnc.pas               
GX_About.pas                        
GX_ActionBroker.pas               
GX_Actions.pas         
.......
dmSharedImages.dfm               
fmAbout.dfm                        
fmAlign.dfm                        
fmAlignOptions.dfm               
fmAsciiChart.dfm                  
fmBackup.dfm                       
fmBackupConfig.dfm                 
fmBackupOptions.dfm               
..........
作者: VAF     时间: 2008-11-9 02:50
如果你是为了研究批处理, 请继续研究.

如果你想实用, 一个叫 PDEL.EXE 的程序应该可完成任务.
作者: dejoy     时间: 2008-11-9 02:59
谢谢,我是实用+顺便学习研究. pdel.exe的我google过了,找不到那儿下载.
还请教如何达到标题的目的?

[ Last edited by dejoy on 2008-11-9 at 03:19 ]
作者: VAF     时间: 2008-11-9 03:25
看能否给你个

附件上传成功

PDEL
空参数会显示用法帮助.

[ Last edited by VAF on 2008-11-9 at 03:31 ]
附件 1: PDEL.ZIP (2008-11-9 03:26, 46.81 K,下载次数: 19)

作者: dejoy     时间: 2008-11-9 05:20
谢谢,我仔细看了,不过好像没有能实现我标题的参数?请教楼上的应该使用什么参数实现?
作者: VAF     时间: 2008-11-9 05:43
你的 Filter.txt 应更名为 PDEL.EXC
并须与 PDEL.EXE 在同一目录中.
且最好以全称路径描述你要排除的文件, 一行一个文件地说.

PDEL /EX

另根据需要还可加上其它参数,
如: /NC /RE /NM /NS /NW /EQ /BA ......等.

[ Last edited by VAF on 2008-11-9 at 05:52 ]
作者: dejoy     时间: 2008-11-9 05:52
不行啊,帮助中就没有EX这个参数,我按你的方法,执行pdel cw /EX,结果弹出一个窗口,are you sure to del *.* y/n? 结果Y把CW整个目录下的文件都删除了,并没有排除PDEL.EXC中的文件;N呢什么也不做.
作者: VAF     时间: 2008-11-9 06:05
/EX 参数有的, 在第11行吗, 做实验前应用备份做, 以免造成损失.

你的应用我实际应用过, 命令用法正确的话不会发生错误的.
作者: pusofalse     时间: 2008-11-9 06:06

@echo off
cd.>tmp.txt
for /r GExperts\ %%a in (*) do echo>>tmp.txt %%a
for /f "delims=" %%a in ('findstr /veg:filter.txt tmp.txt') do echo del /f "%%a"
del tmp.txt
pause
放到GExperts所在目录中,如果输出正确 就把第4行的echo去掉。。。
作者: VAF     时间: 2008-11-9 06:19
高手来了.

我就是搞不掂 for
作者: dejoy     时间: 2008-11-9 07:32
呵呵 我也是知道用for应该是能搞定的,我也是就不会用for

楼上的高手,你的还是不行啊,按你的方法,我运行后生成一个tmp.txt,内容如下:
offcd. /r GExperts\ %a in (*) do echo %afor /f "delims=" %a in ('findstr /veg:filter.txt tmp.txt') do echo del /f "%a"del tmp.txtpause
不知何故.

我不会用for,不过好像应该可以直接用for .... in (Filter.txt) ....这样直接读取文件内容么?
再加一小点要求,把bat和filter.txt放到被执行的目录里不太好办,因为整个目录里的文件都要被操作(删除或重命名,如果成功BAT本身就挂了)最好是能放在外部,指定为参数,如 d:\temp\XXX.bat e:\GExperts e:\t\Filter.txt

[ Last edited by dejoy on 2008-11-9 at 07:44 ]
作者: ZJHJ     时间: 2008-11-9 09:30
批处理完全可以做到删除列表以外的文件。
1 如果列表中没有路径,则要搜索路径
2 搜索当前所有文件路径
3 对比二个列表,将不在列表1的文件删除。
作者: pusofalse     时间: 2008-11-9 17:21    标题: Re 11:

不可能不行,我在我电脑里测试通过的。。。。
的确是要生成个tmp.txt, 里面的内容是GExperts\下级的文件列表。。。
是你的使用方法问题。存为批处理,放到GExperts\同级目录中(filter.txt同是),双击。。
作者: dejoy     时间: 2008-11-9 21:14
我就是这么做的啊,唯一的不同的是我不是直接点击,而是在DOS窗口下进入此目录后执行BAT
作者: dejoy     时间: 2008-11-12 00:03
继续呼叫大大
作者: HAT     时间: 2008-11-12 09:53    标题: Re 14楼

你按照13的方法直接双击的结果如何呢?
作者: dejoy     时间: 2008-11-16 22:25
先对各位帮助回复的大大说声抱歉,因为出差,一个星期没关注回帖了,sorry!

经测试,需要把bat及filter.txt放在gexperts的上一个同目录中,双击可以执行,结果也算正确,删除了所有非列表中的文件,谢谢.

不过还想提点小问题:1.执行后删除了文件,但留下了空目录.2.直接删除了就没了,我是需要测试那些文件需要用到保留不能删除,就添加到filter.txt列表中,可是现在是直接删除了,测试一个文件时需要重新复制整个目录来确定此文件是否被需要,能否把删除改成重命令,如a.xx 到a.xx_,这样我确定每个文件是否需要时就不用复制整个目录,只要改此文件名即可. 因为整个目录有几百个文件,所以提点此要求.

关于第2点,我自己尝试后发现用ren test1.bat *_ 就可以把test1.bat重命名为test1.bat_了,但不知在13楼的代码中应该如何写?
3.如何把test1.bat_这样的文件名重重名回test1.bat,即去掉_  

我在for使用do ren "%%a" "%%a_" 或do ren "%%a" *_  似乎都不正确

我再尝试,发现似乎不是上面的没有重命名,而且有很多类似GX_EditorExpert.pas这样的文件,对于这类文件名带_的文件,执行do ren "%%a" *_  后GX_EditorExpert.pas就变成GX_了,根本就没有得到正确结果,后面的重命名自然无法继续执行下去了,因为GX_已经存在,无法再重命名.

[ Last edited by dejoy on 2008-11-16 at 22:42 ]
作者: dejoy     时间: 2008-11-16 22:43
虽然我可以用~等其它文件名中没有的符号替换_实现目的,不过还是作为一个技术问题请教大家.

再请教一个,如果要把一个目录添加到Filter.txt中,而不只是文件名,如目录名.svn,则.svn目录下的所有文件都忽略,又应该怎么攺写呢?

[ Last edited by dejoy on 2008-11-16 at 23:03 ]