标题: [文本处理] [已解决]怎样在指定目录及子目录下查找含特定字符的文件? [打印本页]
作者: super1129 时间: 2011-10-3 13:11 标题: [已解决]怎样在指定目录及子目录下查找含特定字符的文件?
本帖最后由 super1129 于 2011-10-8 09:38 编辑
请问大家要想在e:\abc及其子目录下,查找含有1.txt中的字符串的文件。
1.txt比如包含
abc
123
123.pdf
……
(可能有后缀名)
如果在e:\abc及其子目录下的文件名中找到含有上述字符串的文件(包含即可),并拷贝到D:\123 下,找不到就将1.txt中字符输出到D:\123\error.txt
应该是要用findstr
谢谢
忠心感谢 耐心的guaiwu 、FOR 及 BAT1
作者: hkmhd 时间: 2011-10-3 13:39
感觉你的需求写得有点乱, 不太理解. 希望补充文件名实例.
再问几个问题.
1. 在你提供的例子中, 有一个文件名比较. 是必须比较这个名吗? 还是2所描述的需求? 这个关系到后面的问题该如何处理.
2. 是所有的TXT中, 尾数包含 1 的TXT文件吗?
3. 找到则拷贝, 这里面子目录是否会出现同样的文件名? 有无的处理方式要求如何?
4. 否则的输出, 是要求输出什么? 输出这个目录里不存在包含 1 结尾的TXT文件?
作者: super1129 时间: 2011-10-3 13:43
感觉你的需求写得有点乱, 不太理解. 希望补充文件名实例.
再问几个问题.
1. 在你提供的例子中, 有一个文件 ...
hkmhd 发表于 2011-10-3 13:39
1.txt是用来存储我要搜索的字符串的。
一行一个字符串。
作者: hkmhd 时间: 2011-10-3 14:54
遇到一个问题, for 找不到的文件, 不知道为何 if 的时候不会出错. 求大师解答吧.- @echo
- del 1.txt,error.txt 2>nul
- for %%i in ("abc.txt","123.txt","ddd.txt","123.pdf") do (
- echo %%i>>1.txt
- echo.>11\%%i
- )
- for /f %%a in (1.txt) do (
- for /r %%a in (*%%a*) do (
- if exist "%%a" (xcopy /s /e /y "%%a") else (echo "%%a">>error.txt)
- )
- )
- pause
复制代码
作者: super1129 时间: 2011-10-3 15:22
回复 4# hkmhd
我的主要问题是不能复制e:abc及其子目录下的符合要求的文件。
你的程序中没有体现这个呀
作者: guaiwu 时间: 2011-10-3 15:40
本帖最后由 guaiwu 于 2011-10-3 15:42 编辑
if exist e:\abc\*%%a* (echo d|xcopy e:\abc\*%%a* D:\123 /s /e /y ) else echo %%a>>D:\123\error.txt
没发现这段有问题吗?
xcopy e:\abc\*%%a* D:\123 /s /e /y
第一次:由于没发现定文件夹或文件,输入D选项确定是一个文件夹
第二次:输入D为无效。并出现创建新文件出错。
作者: super1129 时间: 2011-10-3 15:42
没发现这段有问题吗?
xcopy e:\abc\*%%a* D:\123 /s /e /y
第一次:由于没发现定文件夹或文件,输入D选 ...
guaiwu 发表于 2011-10-3 15:40
谢谢,那请问该如何写bat程序呢?
作者: guaiwu 时间: 2011-10-3 16:56
本帖最后由 guaiwu 于 2011-10-3 17:33 编辑
- @echo off
- for /f "delims=" %%a in (1.txt) do (
- for /f "delims=" %%i in ('dir /s /b e:\abc') do (
- echo %%~nxi | findstr %%a &&echo f | xcopy "%%~fi" "e:\123\%%~nxi" /s || echo %%~fi >>error.txt
- ))
- pause
复制代码
警告哦 这个批处理只能运行一次 运行多次是重名的
注意1.txt的文件名不能有冲突哦
作者: super1129 时间: 2011-10-3 17:27
回复 8# guaiwu
谢谢,就是后面那句 如果1.txt中的字符串没有匹配到文件,则输出到error.txt 没有体现。
上面的代码得到的error.txt 中 把e:\abc及其子目录下所有的文件及文件夹都列出来了,不是我要的目的。
我的目的是,1.txt 中字符串如果匹配到文件就复制,匹配不到的就输出至error.txt
作者: FOR 时间: 2011-10-3 17:51
- @echo off
- dir /b/s/a-d "e:\abc\*.*">tem.txt
- findstr /ivg:tem.txt 1.txt>d:\123\error.txt
- for /f "delims=" %%i in ('findstr /ig:1.txt tem.txt') do copy /y "%%i" "d:\123"
- del tem.txt
- pause
复制代码
作者: hkmhd 时间: 2011-10-3 20:07
本帖最后由 hkmhd 于 2011-10-3 20:13 编辑
回复 hkmhd
我的主要问题是不能复制e:abc及其子目录下的符合要求的文件。
你的程序中没有体现这 ...
super1129 发表于 2011-10-3 15:22
为了测试, 所以没有明确遍历文件的路径. 不过后面有更好的思路, 所以无视吧.
作者: guaiwu 时间: 2011-10-3 20:15
回复 10# FOR
findstr /ivg:tem.txt 1.txt>d:\123\error.txt
请问 这句话起什么作用。 有两段findstr命令在findstr /?中找不到帮助?
作者: FOR 时间: 2011-10-3 20:45
回复 12# guaiwu
1.txt 中有 tem.txt 中没有的
作者: super1129 时间: 2011-10-3 21:53
本帖最后由 super1129 于 2011-10-3 22:14 编辑
回复 10# FOR
谢谢,好像error.txt 并不是所需要的没有匹配到的。
是不是因为 tem.txt 是包含路径的原因,所以导致这个不对呢? /ivg:tem.txt 1.txt
麻烦再看看,谢谢
作者: FOR 时间: 2011-10-3 22:36
回复 14# super1129
dir/b/s/a-d "e:\abc\*.*">2.txt
运行上面的,把1.txt 和 2.txt 发附件上来。
作者: super1129 时间: 2011-10-3 22:47
本帖最后由 super1129 于 2011-10-3 22:50 编辑
回复 super1129
dir/b/s/a-d "e:\abc\*.*">2.txt
运行上面的,把1.txt 和 2.txt 发附件上来。
FOR 发表于 2011-10-3 22:36
e:\abc 下文件为 123.txt 789.pdf
1.txt 是
123.txt
789.pdf
456.txt
2.txt是
e:\abc\123.txt
e:\abc\789.pdf
作者: FOR 时间: 2011-10-3 23:26
我那个 findstr 确实不行,得另想办法。
作者: BAT1 时间: 2011-10-4 01:40
本帖最后由 BAT1 于 2011-10-4 02:50 编辑
我在X:\ 下面写出来的的,用的时候,请根据自己的实际情况修改一下吧.- @echo off
- if not exist "1.txt" echo 1.txt 在哪里?&pause >nul & exit
- if not exist "x:\123" md x:\123
- if exist 2.txt del 2.txt
- for /f "delims=" %%j in (1.txt) do (
- if exist "x:\abc\%%j" echo 在x:\abc发现%%j & copy "x:\abc\%%j" "x:\123\%%j"
- for /f "delims=" %%i in ('dir /a:d /b /s x:\abc') do (
- if exist "%%i\%%j" echo 在%%i发现%%j & copy "%%i\%%j" "x:\123\%%j"
- ))>nul
- echo 已经拷贝指定文件!!!
- for /f %%i in (1.txt) do (
- echo %%i
- if not exist "x:\123\%%i" echo %%i >>2.txt
- )>nul
- if exist "x:\2.txt" echo 但找不到下例文件:& type 2.txt
- pause
复制代码
作者: FOR 时间: 2011-10-4 06:46
只想到这种嵌套循环对比判断的方法,文件太大则效率不高-
- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (1.txt) do (
- set "num="
- for /f "delims=" %%j in (tem.txt) do (
- set "var=%%j"
- set "str=!var:%%i=!"
- if not "!var!"=="!str!" set num=n
- )
- if not defined num echo %%i
- ))>error.txt
- start error.txt
复制代码
作者: super1129 时间: 2011-10-4 08:46
回复 18# BAT1
谢谢,这个程序用于查找完全匹配的没有问题。也非常好。
但是我希望能实现模糊匹配,就是说 文件名为123456[a].pdf、789[a].doc 之类的,我在1.txt中输入[a] 也要匹配到这两个文件。
不知道有没有办法实现呢?
作者: super1129 时间: 2011-10-4 09:06
回复 19# FOR
没问题了,辛苦了,非常感谢
作者: guaiwu 时间: 2011-10-4 23:48
本帖最后由 guaiwu 于 2011-10-4 23:52 编辑
回复 8# guaiwu
听取CrLf 的意见,加了班 到了12点终于研究出来粗成果。
参考下现在的效果- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in (1.txt) do (
- for /f "delims=" %%i in ('dir /s /b e:\abc') do (
- echo %%~nxi | findstr %%a &&echo f | xcopy "%%~fi" "e:\123\%%~nxi" /s
- ))
- set str1=dir /b E:\123
- set str2=dir /b E:\abc
- for %%a in ("%str1%" "%str2%") do (
- set /a b+=1
- for /f "delims=" %%i in ('%%a') do (
- set /a a+=1
- set _!a!=%%~nxi
- )
- set .!b!=!a!
- )
- set /a c=!.1!+1
- for /l %%i in (1,1,%.1%) do (
- for /l %%j in (!c!,1,%.2%) do (
- if !_%%i! equ !_%%j! (
- set _%%i= -
- )))
- for /l %%i in (1,1,%a%) do echo !_%%i!>>error.txt
- pause
复制代码
见到FOR做出的,没办法人家的水平只能到这。 别见笑
作者: Batcher 时间: 2011-10-5 10:09
回复 22# guaiwu
CrLf有木有建议过你写代码的时候要使用缩进啊?
作者: guaiwu 时间: 2011-10-5 14:40
回复 23# Batcher
CrLf 并没有给我什么提示 我只是给自己写的代码升级了一下效率
不关效果什么样。 我不抄袭做出来的请别这么贬低别人好么。
怎么说这是人家的花了时间心血写出来的。并不是随随便便。
作者: Batcher 时间: 2011-10-5 15:18
回复 24# guaiwu
建议你用缩进就是贬低你?
作者: FOR 时间: 2011-10-5 15:20
回复 24# guaiwu
batcher 版主的意思是建议你写代码时缩进
否则读你的代码很累
缩进方法,通常是每对括弧内的语句前面都加几个空格或制表符
如- for /l %%i in (1 1 2) do (
- 命令
- 命令
- for /l %%j in (1 1 2) do (
- 命令
- 命令
- for /l %%j in (1 1 2) do (
- 命令
- 命令
- )
- )
- )
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |