在Windows命令行管理程序中,如何获取FOR循环或DIR命令以匹配仅提供的文件扩展名模式?或者说另一种方式,如何做非贪婪的扩展匹配?
例如,一个目录包含floo.tif
,floorbar.tiff
,floormatic.tifw
,我只想对floo.tif
进行操作
for %%a in (floo*.tif) do @echo %%a
结果:
floo.tif
floorbar.tiff
floormatic.tifw
这是理想的结果:
floo.tif
dir *.tif
也有相同的结果。
答案 0 :(得分:2)
我的想法是:
dir /b | findstr /i "^floo.*\.tif$"
或
dir /b floo*.tif | findstr /i "tif$"
要么阻止匹配.tiff和.tifw,给你预期的结果。
findstr
的正则表达式词汇受到严格限制。例如,您无法\w
匹配单词字符,并且不支持(foo|bar|baz)
表示法。但至少它提供了比标准通配符匹配更精细的控制。请findstr /?
查看支持的语法。
for /f "delims=:" %%I in ('dir /b floo*.tif ^| findstr /i "tif$"') do (
rem process each %%I match
)
答案 1 :(得分:1)
我有一个Win32命令行实用程序,用于查找我很久以前写过的文件名,因为它匹配长文件名,所以它没有遇到这个问题: vfind.exe。 (也可以使用源代码。)
我这样用:
for /f "delims=" %%i in ('vfind floo*.tif') do @echo %%a
答案 2 :(得分:1)
for /f "eol=: delims=" %%a in (
'dir /b /a-d floo*.tif^|findstr /ix "floo.*\.tif"'
) do echo %%a
答案 3 :(得分:1)
这是我最终为手头的项目所做的事情,虽然下次我会考虑使用@denham和@rojo推荐的@ Loadmaster的vfind或findstr。
for %%a in (*.tif) do (
if /i "%%~xa"==".tif" @echo Doing something to %%a...
)
if
的优点是不需要运行任何其他程序,因此编写速度更快,更紧凑,以后更容易进行心理解码。 vfind的优点是它完全直观和清晰,而findstr在模式匹配中提供了更多控制。