标题: [文件操作] [已解决]批量搜索并移动文件 [打印本页]
作者: lxh623 时间: 2008-11-24 15:09 标题: [已解决]批量搜索并移动文件
本帖最后由 lxh623 于 2011-11-13 15:04 编辑
首先,D:/pdf文件夹含有如下pdf(目录文件列表1.txt):
JP9316337-=6090879-DCT
JP9316331-=5788884-SE
JP9314875-=6004658-SE
JP9310094-=6239098-SE
JP9310025-=5744508-SE
JP9268281-=5853896-DCT
JP9268256-=5705587-DCT
JP9208828-=5824729-DCT
JP9176490-=5936033-SE
JP63202658-=EP0350519-DCT
JP63193958-=EP0278731-SE
E盘可能有文件名包括6090879等的文件。
我想,用等号后面的,比如“6090879”(等号=以后、-DCT/-SE/-GET/-WKA以前的字符),去搜索E盘。如果有,就把“JP9316337-=6090879-DCT”移动到E盘“6090879”所在同级目录;JP9316331-=5788884-SE.pdf移动到5788884所在地方……
拜托!谢谢!
[ 本帖最后由 lxh623 于 2008-11-24 21:08 编辑 ]
作者: namejm 时间: 2008-11-24 18:22
1、用批处理做整个分区的搜索,速度将十分缓慢,特别是存在大量文件夹或文件的时候;
2、移动到同一分区中,很可能造成重复搜索;
至于批处理能否解决你的问题,答案是肯定的,但是,因为以上两个不利因素,整理的速度将会极其缓慢,需要你更换整理方案。
推测你是想把散布在E盘不同位置上的所有pdf文件都集中放到指定的文件夹下,而所有的pdf文件的名字都是比较有规律的,而1.txt中的内容就是pdf文件的名字,不知道这个推测是否正确。如果这个推测正确的话,其实可以不用1.txt文件就可以做到,并且效率比较高,但是需要你用尽可能准确的语言去描述文件的位置、文件名的规律及你的意图,并尽量不要限制解决方案,比如说一定要通过1.txt中的内容去搜索E盘。
请在顶楼更新你的需求,以方便大家写代码。
作者: lxh623 时间: 2008-11-24 21:00
原帖由 namejm 于 2008-11-24 18:22 发表
请在顶楼更新你的需求,以方便大家写代码。
谢谢您!!
已经修改!我想每个文件分别进入对应的文件的路径,不是集中到一个地方。
[ 本帖最后由 lxh623 于 2008-11-24 21:02 编辑 ]
作者: namejm 时间: 2008-11-24 22:04
疑问1:“D:/pdf文件夹含有如下pdf(目录文件列表1.txt)”,下面列举的究竟是文件名还是文件夹名?你所说的“目录文件”四字让人疑窦重重;
疑问2:“E盘可能有文件名包括6090879等的文件”,这个6090879是指6090879.pdf还是指只要文件名中含有6090879字符串的pdf文件或所有文件都算在内?
疑问3:如果只要包含有6090879这个字符串的文件都算在内,是否会有多个文件?
建议:复杂需求请尽量用准确的语言描述清楚,不要用似是而非或自相矛盾的词汇让别人产生歧义。
作者: lxh623 时间: 2008-11-24 22:16
原帖由 namejm 于 2008-11-24 22:04 发表
疑问1:“D:/pdf文件夹含有如下pdf(目录文件列表1.txt)”,下面列举的究竟是文件名还是文件夹名?你所说的“目录文件”四字让人疑窦重重;
疑问2:“E盘可能有文件名包括6090879等的文件”,这个6090879是指 ...
1、pdf文件
2、包含
3、可能没有,可能多个,移动到任意一个都行!
作者: namejm 时间: 2008-11-24 22:25
是必须在pdf文件名中包含还是所有类型的文件名中包含都算?
另:E盘的路径中是否包含有特殊字符?如&、!。
作者: lxh623 时间: 2008-11-24 22:36
原帖由 namejm 于 2008-11-24 22:25 发表
是必须在pdf文件名中包含还是所有类型的文件名中包含都算?
另:E盘的路径中是否包含有特殊字符?如&、!。
pdf!
可能有“品种-■阻燃”等,▲、◆、★、▲▲等字符。这个会有影响吗?
作者: namejm 时间: 2008-11-24 22:47
只要不包含&和!就可以。
假设E盘所有路径中,.pdf只是后缀名,而不可能出现在文件夹名和文件名中,那么,把如下代码放在与1.txt相同的路径下运行即可。
考虑到效率问题,生成了临时文件list.txt,请自行删除;若屏幕提示的内容与你的预期吻合,请把 echo 把 d:/pdf/%%i.pdf 移动到 "%%~dpk" 替换为 move d:/pdf/%%i.pdf "%%~dpk" (代码未经测试,请先测试后再修改):- @echo off
- echo 全盘扫描E盘下的pdf文件,请耐心等待...
- cd.>list.txt
- for /f "delims=" %%i in ('dir /a-d /b /s e:\*.pdf 2^>nul') do (echo %%i)>>list.txt
- echo.>>list.txt
- cls
- for /f "delims=" %%i in (1.txt) do (
- for /f "tokens=2 delims==-" %%j in ("%%i") do (
- for /f "delims=" %%k in ('findstr /iec:"%%j.pdf" list.txt 2^>nul') do (
- echo 把 d:/pdf/%%i.pdf 移动到 "%%~dpk"
- )
- )
- )
- pause
复制代码
————————————————————————————————————
d:/pdf/%%i.pdf 应为 d:\pdf\%%i.pdf ,本机路径用反斜杠而非斜杠,特此更正。
——namejm 2008.11.25
作者: lxh623 时间: 2008-11-25 08:15
我用一个pdf做实验。
把 echo 把 d:/pdf/%%i.pdf 移动到 "%%~dpk" 替换为 move d:/pdf/%%i.pdf "%%~dpk"
说“语法错误”。
把 把 d:/pdf/%%i.pdf 移动到 "%%~dpk" 替换为 move d:/pdf/%%i.pdf "%%~dpk"
没有移动。
1.txt和list.txt都用%%i?。我是外行,不太懂。请大侠帮助修改!
[ 本帖最后由 lxh623 于 2008-11-25 09:03 编辑 ]
作者: 随风 时间: 2008-11-25 14:40
如果1.txt 文件不是很大的话,可以这样,效率应该会高点。
显示正确后去掉 echo 即可。
未测试。。。
:- @echo off
- for /f "delims=" %%i in ('dir/b/s/ad e:\') do (
- for /f "delims=" %%a in (1.txt) do (
- for /f "tokens=2 delims==-" %%b in ("%%a") do (
- if exist "%%i\*%%b*.pdf" echo move "d:/pdf/%%a.pdf" "%%i" 2>nul
- )))
- pause
复制代码
[ 本帖最后由 随风 于 2008-11-25 18:28 编辑 ]
作者: namejm 时间: 2008-11-25 17:58
原帖由 lxh623 于 2008-11-25 08:15 发表
我用一个pdf做实验。
把 echo 把 d:/pdf/%%i.pdf 移动到 "%%~dpk" 替换为 move d:/pdf/%%i.pdf "%%~dpk"
说“语法错误”。
把 把 d:/pdf/%%i.pdf 移动到 "%%~dpk" 替换为 move d:/pdf/%%i.pdf "%%~dpk"
没有 ...
不好意思,本机路径中应该是反斜杠而不是斜杠,是我把路径写错了,d:/pdf/%%i.pdf 应该是 d:\pdf\%%i.pdf ,请再次测试。
作者: terse 时间: 2008-11-25 18:23
RE: namejm管理兄
按楼主的意思这里的 /iec:"%%j.pdf" 可否用 /ic:"%%j" 呢?
RE: 随风兄
呵呵 又是笔误 for /f "delimd="
作者: namejm 时间: 2008-11-25 18:29
RE terse:
/iec:"%%j.pdf" 不能用 /ic:"%%j",因为必须保证.pdf出现在路径的末尾,若有 e:\test.pdf.txt 之类的路径就不是楼主所想要的了。
作者: 随风 时间: 2008-11-25 18:29 标题: 回复 12楼 的帖子
汗,粗心大意,多谢提醒!
但此题应该还有更高效的代码,terse 兄是否发来看看。。
[ 本帖最后由 随风 于 2008-11-25 18:30 编辑 ]
作者: terse 时间: 2008-11-25 20:21
原帖由 随风 于 2008-11-25 18:29 发表
汗,粗心大意,多谢提醒!
但此题应该还有更高效的代码,terse 兄是否发来看看。。
也没思路 我看随风兄的可以少个for如何- @echo off
- for /f "delims=" %%i in ('dir/b/s/ad e:\') do (
- for /f "tokens=2 delims==-" %%j in (a.txt) do (
- if exist "%%i\*%%j*.pdf" echo move "d:\pdf\*%%j*.pdf" "%%i" 2>nul
- ))
- pause
复制代码
楼主如果每个文件仅处理一次 这样的临时文件效率是否。。- @echo off
- dir /b /a-d /s "e:\*.pdf">pdf.txt
- echo.>>pdf.txt
- for /f "tokens=2 delims=-=" %%i in (a.txt) do (
- for /f "delims=" %%j in ('findstr /ic:%%i "pdf.txt" 2^>nul') do (
- if not defined %%i echo move "d:\pdf\*%%~ni*.pdf" "%%~dpj" 2>nul&set %%i=a
- ))
- del pdf.txt
- pause
复制代码
作者: lxh623 时间: 2008-11-25 20:33
真诚感谢三位大侠!我一个外行,蒙您们热心帮助,再次谢谢!
作者: namejm 时间: 2008-11-25 20:48
嘿嘿,for用习惯了,容易造成思维定势,连dir列文件路径的时候都忍不住要for一把,还是terse直接dir更有效率。
作者: CrLf 时间: 2011-11-13 16:02
避免 findstr 进入循环的方案:- @echo off
- for /f "delims=" %%a in (1.txt) do (
- for /f "tokens=2 delims==-" %%b in ("%%a") do (
- echo %%b %%a>>2.txt
- echo %%b>>3.txt
- )
- )
- dir /s /b e:\*.pdf>4.txt
- for /f "delims=" %%a in ('findstr /eg:2.txt 4.txt') do (
- set str=%%~na
- setlocal enabledelayedexpansion
- for /f "tokens=1*" %%b in (3.txt) do (
- if "!file:%%b=!" neq "!file!" move "d:\pdf\%%c.pdf" "%%~dpa"
- )
- )
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |