Board logo

标题: [文件操作] [已解决]批量搜索并移动文件 [打印本页]

作者: 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" (代码未经测试,请先测试后再修改):
  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
作者: 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 即可。
未测试。。。
:
  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 编辑 ]
作者: 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如何
  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
复制代码

作者: lxh623    时间: 2008-11-25 20:33

真诚感谢三位大侠!我一个外行,蒙您们热心帮助,再次谢谢!
作者: namejm    时间: 2008-11-25 20:48

  嘿嘿,for用习惯了,容易造成思维定势,连dir列文件路径的时候都忍不住要for一把,还是terse直接dir更有效率。
作者: CrLf    时间: 2011-11-13 16:02

避免 findstr 进入循环的方案:
  1. @echo off
  2. for /f "delims=" %%a in (1.txt) do (
  3. for /f "tokens=2 delims==-" %%b in ("%%a") do (
  4. echo %%b %%a>>2.txt
  5. echo %%b>>3.txt
  6. )
  7. )
  8. dir /s /b e:\*.pdf>4.txt
  9. for /f "delims=" %%a in ('findstr /eg:2.txt 4.txt') do (
  10. set str=%%~na
  11. setlocal enabledelayedexpansion
  12. for /f "tokens=1*" %%b in (3.txt) do (
  13. if "!file:%%b=!" neq "!file!" move "d:\pdf\%%c.pdf" "%%~dpa"
  14. )
  15. )
  16. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2