[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]批量搜索并移动文件

本帖最后由 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 编辑 ]
1

评分人数

    • CrLf: 感谢给帖子标题标注[已解决]字样PB + 1

  1、用批处理做整个分区的搜索,速度将十分缓慢,特别是存在大量文件夹或文件的时候;
  2、移动到同一分区中,很可能造成重复搜索;

  至于批处理能否解决你的问题,答案是肯定的,但是,因为以上两个不利因素,整理的速度将会极其缓慢,需要你更换整理方案。

  推测你是想把散布在E盘不同位置上的所有pdf文件都集中放到指定的文件夹下,而所有的pdf文件的名字都是比较有规律的,而1.txt中的内容就是pdf文件的名字,不知道这个推测是否正确。如果这个推测正确的话,其实可以不用1.txt文件就可以做到,并且效率比较高,但是需要你用尽可能准确的语言去描述文件的位置、文件名的规律及你的意图,并尽量不要限制解决方案,比如说一定要通过1.txt中的内容去搜索E盘。

  请在顶楼更新你的需求,以方便大家写代码。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

原帖由 namejm 于 2008-11-24 18:22 发表
  请在顶楼更新你的需求,以方便大家写代码。

谢谢您!!
已经修改!我想每个文件分别进入对应的文件的路径,不是集中到一个地方。

[ 本帖最后由 lxh623 于 2008-11-24 21:02 编辑 ]

TOP

  疑问1:“D:/pdf文件夹含有如下pdf(目录文件列表1.txt)”,下面列举的究竟是文件名还是文件夹名?你所说的“目录文件”四字让人疑窦重重;
  疑问2:“E盘可能有文件名包括6090879等的文件”,这个6090879是指6090879.pdf还是指只要文件名中含有6090879字符串的pdf文件或所有文件都算在内?
  疑问3:如果只要包含有6090879这个字符串的文件都算在内,是否会有多个文件?

  建议:复杂需求请尽量用准确的语言描述清楚,不要用似是而非或自相矛盾的词汇让别人产生歧义。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

原帖由 namejm 于 2008-11-24 22:04 发表
  疑问1:“D:/pdf文件夹含有如下pdf(目录文件列表1.txt)”,下面列举的究竟是文件名还是文件夹名?你所说的“目录文件”四字让人疑窦重重;
  疑问2:“E盘可能有文件名包括6090879等的文件”,这个6090879是指 ...

1、pdf文件
2、包含
3、可能没有,可能多个,移动到任意一个都行!

TOP

  是必须在pdf文件名中包含还是所有类型的文件名中包含都算?

  另:E盘的路径中是否包含有特殊字符?如&、!。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

原帖由 namejm 于 2008-11-24 22:25 发表
  是必须在pdf文件名中包含还是所有类型的文件名中包含都算?

  另:E盘的路径中是否包含有特殊字符?如&、!。

pdf!
可能有“品种-■阻燃”等,▲、◆、★、▲▲等字符。这个会有影响吗?

TOP

  只要不包含&和!就可以。

  假设E盘所有路径中,.pdf只是后缀名,而不可能出现在文件夹名和文件名中,那么,把如下代码放在与1.txt相同的路径下运行即可。

  考虑到效率问题,生成了临时文件list.txt,请自行删除;若屏幕提示的内容与你的预期吻合,请把 echo 把 d:/pdf/%%i.pdf 移动到 "%%~dpk"  替换为 move d:/pdf/%%i.pdf "%%~dpk" (代码未经测试,请先测试后再修改):
  1. @echo off
  2. echo 全盘扫描E盘下的pdf文件,请耐心等待...
  3. cd.>list.txt
  4. for /f "delims=" %%i in ('dir /a-d /b /s e:\*.pdf 2^>nul') do (echo %%i)>>list.txt
  5. echo.>>list.txt
  6. cls
  7. for /f "delims=" %%i in (1.txt) do (
  8.     for /f "tokens=2 delims==-" %%j in ("%%i") do (
  9.         for /f "delims=" %%k in ('findstr /iec:"%%j.pdf" list.txt 2^>nul') do (
  10.             echo 把 d:/pdf/%%i.pdf 移动到 "%%~dpk"
  11.         )
  12.     )
  13. )
  14. pause
复制代码


————————————————————————————————————
d:/pdf/%%i.pdf 应为 d:\pdf\%%i.pdf ,本机路径用反斜杠而非斜杠,特此更正。
                         ——namejm 2008.11.25
1

评分人数

    • CrLf: 乐于助人技术 + 1
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

我用一个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 编辑 ]

TOP

如果1.txt 文件不是很大的话,可以这样,效率应该会高点。
显示正确后去掉  echo 即可。
未测试。。。
:
  1. @echo off
  2. for /f "delims=" %%i in ('dir/b/s/ad e:\') do (
  3.    for /f "delims=" %%a in (1.txt) do (
  4.       for /f "tokens=2 delims==-" %%b in ("%%a") do (
  5.          if exist "%%i\*%%b*.pdf" echo move "d:/pdf/%%a.pdf" "%%i" 2>nul
  6. )))
  7. pause
复制代码

[ 本帖最后由 随风 于 2008-11-25 18:28 编辑 ]
1

评分人数

    • CrLf: 乐于助人技术 + 1
技术问题请到论坛发帖求助!

TOP

原帖由 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 ,请再次测试。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

RE:  namejm管理兄
按楼主的意思这里的 /iec:"%%j.pdf"   可否用  /ic:"%%j" 呢?
RE:   随风兄
呵呵  又是笔误   for /f "delimd="

TOP

RE terse:

  /iec:"%%j.pdf"   不能用  /ic:"%%j",因为必须保证.pdf出现在路径的末尾,若有 e:\test.pdf.txt 之类的路径就不是楼主所想要的了。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

回复 12楼 的帖子

汗,粗心大意,多谢提醒!
但此题应该还有更高效的代码,terse 兄是否发来看看。。

[ 本帖最后由 随风 于 2008-11-25 18:30 编辑 ]
技术问题请到论坛发帖求助!

TOP

原帖由 随风 于 2008-11-25 18:29 发表
汗,粗心大意,多谢提醒!
但此题应该还有更高效的代码,terse 兄是否发来看看。。

也没思路  我看随风兄的可以少个for如何
  1. @echo off
  2. for /f "delims=" %%i in ('dir/b/s/ad e:\') do (
  3.       for /f "tokens=2 delims==-" %%j in (a.txt) do (
  4.          if exist "%%i\*%%j*.pdf" echo move "d:\pdf\*%%j*.pdf" "%%i" 2>nul
  5. ))
  6. pause
复制代码
楼主如果每个文件仅处理一次 这样的临时文件效率是否。。
  1. @echo off
  2. dir /b /a-d /s "e:\*.pdf">pdf.txt
  3. echo.>>pdf.txt
  4. for /f "tokens=2 delims=-=" %%i in (a.txt) do (
  5.    for /f "delims=" %%j in ('findstr /ic:%%i "pdf.txt" 2^>nul') do (
  6.      if not defined %%i echo move "d:\pdf\*%%~ni*.pdf" "%%~dpj" 2>nul&set %%i=a
  7. ))
  8. del pdf.txt
  9. pause
复制代码
1

评分人数

    • CrLf: 乐于助人技术 + 1

TOP

返回列表