标题: [文件操作] 批处理如何实现在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编码
只要有一个文件没找到,就会继续查找,直到所有文件全部被遍历,然后退出- @echo off & cd /d "%~dp0"
- setlocal enabledelayedexpansion
- set "files="文件名1.mp4" "文件名2.mp4" "文件名3.mp4""
- for /r %%i in (*) do (
- for %%a in (!files!) do (
- if "%%~a"=="%%~nxi" (
- echo 找到%%~a
- echo copy "%%i" "%filePath%"
- set "files=!files:%%a=!"
- if "!files: =!"=="" set "files=NULL" & goto :done
- echo -------------------
- )
- )
- )
- :done
- echo.
- echo 查找完成!
- echo 未找到数据: %files%
- echo.
- 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 - @echo off & cd /d "%~dp0"
- setlocal enabledelayedexpansion
- set "files="文件名1.mp4^|C:\文件夹1" "文件名2.mp4^|C:\文件夹2" "文件名3.mp4^|C:\文件夹3""
- for /r %%i in (*) do (
- for %%a in (!files!) do (
- for /f "tokens=1* delims=|" %%b in ("%%~a") do (
- if "%%b"=="%%~nxi" (
- echo 找到%%b
- mkdir "%%c" >nul 2>nul
- echo copy "%%i" "%%c\"
- set "files=!files:%%a=!"
- if "!files: =!"=="" set "files=NULL" & goto :done
- echo -------------------
- )
- )
- )
- )
- :done
- echo.
- echo 查找完成!
- echo 未找到数据: %files%
- echo.
- 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行改为- for /f "usebackq delims=" %%i in ("a.txt") do set "files=!files! "%%i""
复制代码
a.txt内容如下,ansi编码- 文件名1.mp4|C:\文件夹1
- 文件名2.mp4|C:\文件夹2
- 文件名3.mp4|C:\文件夹3
复制代码
指定路径查找见8楼
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |