Board logo

标题: [文件操作] 批处理如何实现在10T的文件夹下快速搜索指定文件,并且只在第一次搜索到就执行命令 [打印本页]

作者: crestcn    时间: 2021-2-27 17:59     标题: 批处理如何实现在10T的文件夹下快速搜索指定文件,并且只在第一次搜索到就执行命令

我打算实现功能如下:
在某路径下查找指定文件名的文件,找到后把该文件复制到其他路径下
我写的代码如下:
for /f "delims=" %%i in ('dir /s/b/a-d "文件名.mp4"') do (copy "%%i" "%filepath%"\)
这个代码之前执行的挺好,但是现在要在一个非常大的服务器上搜索,差不多10T左右。这样搜索效率就非常差,文件查找的非常慢,而且如果查找到3个同样名称的文件,会复制3次,而且还会找到自己文件夹里面的文件,然后报个错误“”文件无法自身复制“(要复制的路径在要搜索的路径的子目录下面)。
请问下如何优化?
1、怎么样搜索最快?
2、怎么样才能实现第一次找到文件,就执行copy的动作
3、如何实现在不同的目录下搜索?比如在我要搜索的路径如root目录下面有A/B/C/D 4个文件夹,A目录下又有A1/A2/A3文件夹,B目录下又有B1/B2/B3文件夹
     如何实现只在A1文件夹和B1文件夹中搜索那?
4、有没有其他好的方法实现这个功能?比如Python或者其他语言?
多谢大佬们。
作者: flashercs    时间: 2021-2-27 18:58

将该目录添加到索引中。然后在Explorer中查找 文件名.mp4 会快很多。但是创建索引需要较长时间和磁盘空间;创建后以后搜索就快了。
作者: went    时间: 2021-2-27 19:15

for /r %%i in (*文件名.mp4) do if "%%i"=="文件名.mp4" copy "%%i" "%filepath%"\ && goto :done
:done
pause

试试
作者: crestcn    时间: 2021-2-27 19:21

我的脚本可能是要搜索非常多的文件,如下
for /r %%i in (*文件名.mp4) do if "%%i"=="文件名.mp4" copy "%%i" "%filepath%"\
for /r %%i in (*文件名.mp4) do if "%%i"=="文件名2.mp4" copy "%%i" "%filepath%"\
for /r %%i in (*文件名.mp4) do if "%%i"=="文件名3.mp4" copy "%%i" "%filepath%"\
这样再每一行叫goto是不是就不能执行下一个脚本命令了呀?
比如如下,这样是不是就不会执行查找文件名2的命令了呀?

for /r %%i in (*文件名.mp4) do if "%%i"=="文件名.mp4" copy "%%i" "%filepath%"\ && goto :done
for /r %%i in (*文件名.mp4) do if "%%i"=="文件名2.mp4" copy "%%i" "%filepath%"\ && goto :done

:done
pause
作者: crestcn    时间: 2021-2-27 19:22

回复 2# flashercs
文件是在服务器上,待查找并复制的文件有1000多个,用explorer是不是不能自动批量执行啊?
作者: went    时间: 2021-2-27 22:39

回复 4# crestcn
注意保存ansi编码
只要有一个文件没找到,就会继续查找,直到所有文件全部被遍历,然后退出
  1. @echo off & cd /d "%~dp0"
  2. setlocal enabledelayedexpansion
  3. set "files="文件名1.mp4" "文件名2.mp4" "文件名3.mp4""
  4. for /r %%i in (*) do (
  5. for %%a in (!files!) do (
  6. if "%%~a"=="%%~nxi" (
  7. echo 找到%%~a
  8. echo copy "%%i" "%filePath%"
  9. set "files=!files:%%a=!"
  10. if "!files: =!"=="" set "files=NULL" & goto :done
  11. echo -------------------
  12. )
  13. )
  14. )
  15. :done
  16. echo.
  17. echo 查找完成!
  18. echo 未找到数据: %files%
  19. echo.
  20. pause&exit
复制代码

作者: crestcn    时间: 2021-3-1 09:43

回复 6# went
多谢大佬,我研究下
但是这个脚本会存在一个问题,我是从excel表单上拼接的脚本,吧要搜索的文件和要存放的地方,拼接起来成一个脚本
每个要搜索的文件都对应不同的存放路径,你这个脚本只能放在一个固定的路径下面吧,如何能实现不同的文件放在不同的路径下面那?
作者: went    时间: 2021-3-1 13:35

回复 7# crestcn

    查找C盘windows路径
    for /r "C:\Windows" %%i
作者: crestcn    时间: 2021-3-1 14:31

回复 8# went
如何做到copy到不同的路径那?比如查找文件A,放到路径A下面,查找路径B,放到路径B下面,比如下面脚本中%filePath%是不同的,不是同样的路径。
echo copy "%%i" "%filePath%"
作者: went    时间: 2021-3-1 19:11

回复 9# crestcn
  1. @echo off & cd /d "%~dp0"
  2. setlocal enabledelayedexpansion
  3. set "files="文件名1.mp4^|C:\文件夹1" "文件名2.mp4^|C:\文件夹2" "文件名3.mp4^|C:\文件夹3""
  4. for /r %%i in (*) do (
  5. for %%a in (!files!) do (
  6. for /f "tokens=1* delims=|" %%b in ("%%~a") do (
  7. if "%%b"=="%%~nxi" (
  8. echo 找到%%b
  9. mkdir "%%c" >nul 2>nul
  10. echo copy "%%i" "%%c\"
  11. set "files=!files:%%a=!"
  12. if "!files: =!"=="" set "files=NULL" & goto :done
  13. echo -------------------
  14. )
  15. )
  16. )
  17. )
  18. :done
  19. echo.
  20. echo 查找完成!
  21. echo 未找到数据: %files%
  22. echo.
  23. pause&exit
复制代码

作者: crestcn    时间: 2021-3-2 09:31

回复 10# went
多谢大佬!!
如果把要查找的文件放到一个txt文件中,脚本读取这个文件中的内容然后查找并copy可以实现吗?同时指定查找的目录为C:/目录A/子目录A1,C:/目录B/子目录B2
比如a.txt,内容如下
"文件名1.mp4^|C:\文件夹1"
"文件名2.mp4^|C:\文件夹2"
"文件名3.mp4^|C:\文件夹3"
作者: went    时间: 2021-3-2 22:46

回复 11# crestcn

第3行改为
  1. for /f "usebackq delims=" %%i in ("a.txt") do set "files=!files! "%%i""
复制代码
a.txt内容如下,ansi编码
  1. 文件名1.mp4|C:\文件夹1
  2. 文件名2.mp4|C:\文件夹2
  3. 文件名3.mp4|C:\文件夹3
复制代码
指定路径查找见8楼




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