标题: [文本处理] [已解决]批处理如何查找当前目录及子目录含特定字符串的文件名并输出? [打印本页]
作者: kaze 时间: 2017-2-25 17:58 标题: [已解决]批处理如何查找当前目录及子目录含特定字符串的文件名并输出?
本帖最后由 kaze 于 2017-3-14 11:44 编辑
要求:查找检查当前目录及子目录的txt文件名(检查文件名,不检查目录),查找出 含同名文件名,含字符 空格 ,两个小横号--,符号' 全角字符【数字字母】,文字串副本。提取成文档或echo一下。- @echo off
- for /f "tokens=*" %%i in ('dir /a-d /b /s *.txt^|findstr /i "副本"') do (echo %%i)
- pause
复制代码
问题:1。没有找到findstr查找空格的方法
2. 命令dir /a-d /b /s *.txt显示了目录名,去掉/s又无法检查子目录。
不知道怎么解决,谢谢大家查看!
作者: GNU 时间: 2017-2-25 18:06
echo "bat home" | findstr /c:"bat home"
这样可以查找包含空格的字符串
作者: GNU 时间: 2017-2-25 18:09
先把文件列表输出到一个临时文件,再用findstr查找这个临时文件。- @echo off
- (for /f "tokens=*" %%i in ('dir /a-d /b /s *.txt') do (
- echo %%~nxi
- ))>1.log
- findstr "副本" 1.log
- pause
复制代码
作者: kaze 时间: 2017-2-25 18:16
findstr /c " " 1.log 查找空格不行啊,还有其他字符怎么解决呢?
作者: GNU 时间: 2017-2-25 18:37
回复 4# kaze
请注意观察2楼的代码,把你的/c后面的空格改成冒号。
作者: kaze 时间: 2017-2-25 18:42
本帖最后由 kaze 于 2017-2-25 18:48 编辑
回复 5# GNU
谢谢,解决了一部分,全角数字字母怎么查找?最后导出如何再加上路径呢?加一个要求查出同名文件怎么弄?谢谢
作者: GNU 时间: 2017-2-25 19:57
回复 6# kaze
请举例说明你想查找什么全角数字字母?
作者: kaze 时间: 2017-2-25 20:20
回复 7# GNU
主要是所有的全角 数字0-9
作者: GNU 时间: 2017-2-25 20:57
回复 8# kaze
请举个真实例子,我测试一下代码。
作者: kaze 时间: 2017-2-25 21:25
本帖最后由 kaze 于 2017-2-25 21:28 编辑
回复 9# GNU
比如
ABOOK-1.txt
ABOOK-1.txt
ABOOK-1 - 副本.txt
A-BO-O-K-1.txt
B-chapter--2.txt
C-CHAP-TER-3.txt
找出命名不规范的全角字符,主要是数字。不规范(同名文件名,含空格 ,两个小横号--,符号' 全角字符【数字字母】,带副本)
作者: GNU 时间: 2017-2-25 22:58
回复 10# kaze
C:\>type 1.log
ABOOK-1.txt
ABOOK-1.txt
ABOOK-1 - 副本.txt
A-BO-O-K-1.txt
B-chapter--2.txt
C-CHAP-TER-3.txt
C:\>findstr /i "0 1 2 3 4 5 6 7 8 9" 1.log
ABOOK-1.txt
C-CHAP-TER-3.txt
全角数字没问题
作者: kaze 时间: 2017-2-26 14:57
回复 11# GNU
你好,那怎么解决最后导出的文件名如何再加上路径呢?
作者: GNU 时间: 2017-2-26 15:56
回复 12# kaze - @echo off
- for /f "tokens=*" %%i in ('dir /a-d /b /s *.txt') do (
- echo %%~nxi | findstr /i "副本" >nul 2>&1 && echo %%i
- )
- pause
复制代码
作者: kaze 时间: 2017-2-26 23:18
本帖最后由 kaze 于 2017-2-27 10:48 编辑
回复 13# GNU
那就可以修改成这样了: findstr /i "副本 0 1 2 3 4 5 6 7 8 9"
请问符号之类的只能重复一下代码吗?
文件变多的话,代码会卡死( ⊙ o ⊙ )啊!
作者: kaze 时间: 2017-3-8 10:20
回复 13# GNU
请问文件多,代码反应慢怎么解决呢?
findstr /i "副本 0 1 2 3 4 5 6 7 8 9"
作者: GNU 时间: 2017-3-8 10:51
回复 15# kaze
完整代码发出来看看
作者: kaze 时间: 2017-3-8 15:01
本帖最后由 kaze 于 2017-3-8 15:17 编辑
回复 16# GNU - for /f "tokens=*" %%i in ('dir /a-d /b /s *.txt') do (
- echo %%~nxi | findstr /i "副本 0 1 2 3 4 5 6 7 8 9" >nul 2>&1 && echo %%i
- echo %%~nxi | findstr /c:"--" /c:"'" >nul 2>&1 && echo %%i)
- pause
复制代码
没有加入空格查找
作者: GNU 时间: 2017-3-8 21:21
回复 17# kaze
总共多少个文件需要处理?
这个代码的速度大概是每分钟处理几个文件?
作者: kaze 时间: 2017-3-9 12:18
回复 18# GNU
测试了2981个文件,将近两分半分钟。
作者: GNU 时间: 2017-3-9 15:32
回复 19# kaze
还算可以吧,不到3分钟啊。你需要优化到什么级别?
作者: kaze 时间: 2017-3-10 11:03
回复 20# GNU
优化到一分钟内,可以么?
能不能加上空格查找?
作者: kaze 时间: 2017-3-10 19:34
回复 20# GNU
经过测试,还是使用3楼代码,速度快多了,
能不能加上空格和重名文件名查找?
作者: WHY 时间: 2017-3-11 02:17
本帖最后由 WHY 于 2017-3-11 21:06 编辑
- @if (0)==(0) echo off
- dir /b /a-d /s *.txt | cscript //nologo //e:jscript "%~f0"
- pause & goto :EOF
- @end
-
- var str = WSH.StdIn.ReadAll();
- var arr = str.split('\r\n'), len = arr.length;
- var map = [];
-
- for(var i=0; i<len; i++) {
- var key = arr[i].replace(/.+\\(.+)$/, '$1').toLowerCase();
- map[key] ? map[key].push(arr[i]) : map[key] = [arr[i]]
- }
-
- for(key in map) {
- if(map[key].length > 1) WSH.Echo('重复:\r\n' + map[key].join('\r\n'))
- }
-
- var m = str.match(/.*(?:[\uFF10-\uFF19\uFF21-\uFF3A ']|副本|--)[^\\]*\r\n/ig);
- if(m) WSH.Echo('指定字符:\r\n' + m.join(''))
复制代码
作者: kaze 时间: 2017-3-13 12:08
回复 23# WHY
非常感谢,可惜不太懂,请问删除重复检测,是否只需要删除9-17行?,加上其他字符该脚本也管用,前面的[\uFF10-\uFF19\uFF21-\uFF3A ']表示什么意思呢?
如果我在最前面加上说明文字echo怎么会出错呢?
作者: WHY 时间: 2017-3-13 17:00
回复 24# kaze
1.删除 7-18 行即可
2. \uFF10-\uFF19 表示 Unicode 字符中的全角数字,\uFF21-\uFF3A 表示 Unicode 字符中的全角字母(大写),等效于 [0-9A-Z ']
3.代码是用混编方式写的,说明性文字需插在第1~2行之间
如果不需要查找重名文件,或许可以这样- set "s=1 2 3 4 5 6 7 8 9 0 q w e r t y u i o p a s d f g h j k l z x c v b n m ' 副本 --"
- dir /b /a-d /s *.txt | findstr /r /i /c:".* [^\\]*$" /c:".*%s: =[^\\]*$" /c:".*%[^\\]*$"
复制代码
作者: kaze 时间: 2017-3-14 11:43
回复 25# WHY
谢谢,经过验证,23楼和25楼都很不错的代码,受教了!
作者: WHY 时间: 2017-3-30 17:01
PowerShell 可以这样:- dir e:\Test -Include *.txt -Recurse | ?{$_ -is [IO.FileInfo]} | group{$_.Name} | ?{$_.Count -gt 1} | %{'重名:';$_.Group|%{$_.FullName}}
- dir e:\Test -Include '*[0-9a-z '']*.txt', '*副本*.txt', '*--*.txt' -Recurse | %{'指定字符:'}{ $_.FullName }
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |