CMD:`DIR * .ext`和`FOR ...(* .ext)`匹配太多

时间:2013-01-24 22:49:07

标签: batch-file cmd

在Windows命令行管理程序中,如何获取FOR循环或DIR命令以匹配提供的文件扩展名模式?或者说另一种方式,如何做非贪婪的扩展匹配?

例如,一个目录包含floo.tiffloorbar.tifffloormatic.tifw,我只想对floo.tif进行操作

for %%a in (floo*.tif) do @echo %%a

结果:

floo.tif
floorbar.tiff
floormatic.tifw

这是理想的结果:

floo.tif

dir *.tif也有相同的结果。

4 个答案:

答案 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在模式匹配中提供了更多控制。

相关问题