通过扩展名和子字符串搜索迭代文件

Iterate files by extension and substring search

我有这个代码

for /R "C:\myfiles" %%i in (*super*.ts) do (
echo %%i
)

所以我想遍历文件夹 C:\myfiles 中路径 super 并以 .ts 结尾的所有文件。例如

"c:\myfiles\foo\bar\super3.ts"

但是子字符串搜索不起作用。

这个怎么样:

dir /S /B C:\myfiles\*.ts | findstr /I "Super"

解释:

dir /S : search in subdirectories
dir /B : show bare format, like C:\myfile\subdir\filename.ts
...
findstr /I : filter is case insensitive

结果:

for /f "delims=" %%a in ('dir /S /B C:\myfiles\*.ts ^| findstr /I "Super"') do echo %%a

您的 for /R 循环搜索名称包含 super 的文件,但这不是您想要的。

如果出现以下情况之一,您可以使用以下代码片段:

  1. 如果单词super可能出现在路径中的任何位置,甚至在文件名中:

     for /F "delims=" %%F in ('
         dir /S /B /A:-D-H-S "C:\myfiles\*.ts" ^| findstr /I /C:"super"
     ') do (
         echo(%%F
     )
    

    dir/A:-D-H-S 选项排除目录以及隐藏文件和系统文件。

  2. 如果单词super是层次结构中任何目录的名称:

     for /F "delims=" %%F in ('
         dir /S /B /A:-D-H-S "C:\myfiles\*.ts" ^| findstr /I /C:"\super\"
     ') do (
         echo(%%F
     )
    

    findstr搜索表达式中的\构成转义\.

  3. 如果单词super是直接父目录的名称:

     for /F "delims=" %%F in ('
         dir /S /B /A:-D-H-S "C:\myfiles\*.ts" ^| findstr /I /R /C:"\super\[^\][^\]*\.ts$"
     ') do (
         echo(%%F
     )
    

    字符串 \super\[^\][^\]*\.ts$ 是一个 findstr 正则表达式,它锚定到右边 ($) 一个由文字字符串 \super\ 加上一个字符串组成的字符串至少 \ 以外的字符和文字字符串 .ts.

    这里有一个没有 findstrif statement instead, together with a standard for loop 来解析父目录名称的替代方法:

     for /R "C:\myfiles" %%F in (*.ts) do (
         for %%E in ("%%~F\..") do (
             if /I "%%~nxE"=="super" echo(%%~F
         )
     )
    

    这可能会更快,因为没有 for /F and no pipe (|) involved, both of which instantiate new cmd.exe 个实例。