【bat】bat如何删除某个目录下文件名包含abc字符串的文件
【1】需求
有10000多个文件,分布在一个大文件夹下的众多子目录,要删除文件名中包含指定字符集的文件。
如下图:
我要删除 test 目录下包含所有子文件夹的所有 文件名中带有 s1/s2/s3 的文件。
这个需要匹配的字符串已经写到 config.txt 文件中
【2】解决
(2.1)双循环(文件多巨慢,10000*200此循环)
我的10000多个文件,然后需要找的字符串有200个。如果这样双循环,每个 要循环查找200W次,太慢了。
@echo off for /R "D:\test" %%s in (*) do ( for /f %%i in (config.txt) do ( echo %%s | findstr %%i >temp1.log for /f %%f in (temp1.log) do ( if %%f equ '' ( echo %%s skip ) else ( echo %%s need del rem del %%s ) ) ) ) pause
效果如下:
(2.2)善用文件(高效,循环200次)
如下图,我们还可以先 rem 最后一行的 del %%i ,先查看一下是否是我们需要删除的。
即使已经删除了,在 del_filename.txt 里有留存记录,可以知道删除了什么文件。
@echo off Rem 遍历所有文件名,保存到文件 all_filename.txt for /R "D:\test" %%s in (*) do ( echo %%s >> all_filename.txt ) Rem 遍历 config.txt 关键字文件,每个关键字去 all_filename.txt文件中查找,获取需要删除的文件名存储到 del_filename.txt for /f %%i in (config.txt) do ( findstr %%i all_filename.txt >>del_filename.txt ) Rem 删除需要删除的文件名 for /f %%i in (del_filename.txt) do ( echo delfile %%i del %%i )
【无效案例 errorlevel】
之前想用 %errorlevel%,但发现根本不行。不管 findstr 查没查到,永远是0 。
@echo off set search_string=example set file_name=myfile.txt findstr /c:%search_string% %file_name% if %errorlevel% equ 0 ( echo Found! ) else ( echo Not found. )