25楼的代码大致能解决问题
但是,如果环境比较复杂的话,还是会误删文件的
问题出在这一句:- findstr /i /g:a.txt b.txt>c.txt
复制代码 因为 findstr 是部分支持正则表达式的
用 /g:a.txt 从a.txt文件中获取到的字符串几乎每行都含有点号,而点号能匹配任意一个字符
形如 1.pdf 的名称是能和 1Xpdf 这样的字符串匹配的
当 b.txt 中字符串的组成规律足够复杂,出错的几率会很高
另外,从a.txt中获取到的字符串,findstr无法限定它们是否位于绝对路径的最后一层,并且不能限定之后是否包含其他字符
搜索 1.pdf 的时候,能匹配到 d:\test\11.pdf ,也能匹配到 d:\test1.pdf\a.pdf
所以,需要对a.txt中的字符串做进一步处理
当 findstr /g:a.txt 的时候,使得那些特殊字符失去正则意义而回归普通字符的含义,且能限定该字符串等于完整路径的最后一层
一个可行的办法是:
把 a.txt 中每行字符的点号用 \. 来替换,行首添加字符 ^ ,行尾添加字符$
需要用 gsed.exe 进行处理
在25楼的基础上修改如下:- @echo off
- md backup 2>nul
- ::将下一行的crc32.txt替换为实际的文件名
- (for /f "tokens=1*" %%a in (crc32.txt) do (
- if defined %%a (echo,%%b) else set %%a=1
- ))>a.txt
- gsed "s/\./\\./g;s/^/\\\\/;s/$/\$/" a.txt>b.txt
- dir /s /b /a-d>c.txt
- findstr /i /g:b.txt c.txt>d.txt
- for /f "delims=" %%a in (d.txt) do move /y "%%a" backup\
- del a.txt b.txt c.txt d.txt
复制代码 gsed 可以去这里下载:http://www.bathome.net/thread-16975-1-1.html |