通过扩展名和子字符串搜索迭代文件
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
的文件,但这不是您想要的。
如果出现以下情况之一,您可以使用以下代码片段:
如果单词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
选项排除目录以及隐藏文件和系统文件。
如果单词super
是层次结构中任何目录的名称:
for /F "delims=" %%F in ('
dir /S /B /A:-D-H-S "C:\myfiles\*.ts" ^| findstr /I /C:"\super\"
') do (
echo(%%F
)
findstr
搜索表达式中的\
构成转义\
.
如果单词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
.
这里有一个没有 findstr
但 if
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
个实例。
我有这个代码
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
的文件,但这不是您想要的。
如果出现以下情况之一,您可以使用以下代码片段:
如果单词
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
选项排除目录以及隐藏文件和系统文件。如果单词
super
是层次结构中任何目录的名称:for /F "delims=" %%F in (' dir /S /B /A:-D-H-S "C:\myfiles\*.ts" ^| findstr /I /C:"\super\" ') do ( echo(%%F )
findstr
搜索表达式中的\
构成转义\
.如果单词
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
.这里有一个没有
findstr
但if
statement instead, together with a standardfor
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 newcmd.exe
个实例。