我不明白为什么findstr
不按我想要的方式工作。
我的测试目录中有以下文件:
aaa.jpg
bbb.png
ccc.svg
aaa_s.jpg
bbb_s.png
ccc_s.svg
aaa_small.jpg
bbb_small.png
ccc_small.svg
我将以下行直接传递给 cmd.exe:
for /f "delims=" %f in ('dir /b /a:-d ^| findstr /ile "gif jpg png svg" ^| findstr /ie "_s.*"') do echo "%f"
我认为它应该与以下文件匹配:
aaa_s.jpg
bbb_s.png
ccc_s.svg
但实际上这是火柴
aaa_s.jpg
bbb_s.png
ccc_s.svg
aaa_small.jpg
bbb_small.png
ccc_small.svg
是的,我明白问题在于点作为“任何字符”起作用,而不是按字面意思处理。
findstr /ie "_s.*"
Bot 我该如何逃脱呢?使用反斜杠,即将其更改为
findstr /ie "_s\.*"
不起作用。
答案1
我怎样才能转义通配符.
以匹配文字.
字符?
使用 是正确的\
,但您需要一个附加字符.
来找到剩余的字符。
findstr /ie "_s\..*"
示例(类型和cmd
外壳):
F:\test>dir /b /a:-d | findstr /ile "gif jpg png svg" | findstr /ie "_s.*"
aaa_s.jpg
bbb_s.jpg
ccc_s.jpg
aaa_small.jpg
bbb_small.jpg
ccc_small.jpg
F:\test>dir /b /a:-d | findstr /ile "gif jpg png svg" | findstr /ie "_s\..*"
aaa_s.jpg
bbb_s.jpg
ccc_s.jpg
因此您的批处理文件应该包含:
for /f "delims=" %f in ('dir /b /a:-d ^| findstr /ile "gif jpg png svg" ^| findstr /ie "_s\..*"') do echo "%f"
答案2
对于这个特定的任务,你也可以逃避"."
在里面findstr
如果您替换,则不要使用它:
dir /b /a:-d
→ where .:*_s.*
findstr /ie "_s\.*"
→ findstr /ei "gif jpg png svg"
where .:*_s.*|findstr /ei "gif jpg png svg"
for /f delims^= %f in ('where .:*_s.*^|findstr /ei "gif jpg png svg"')do echo "%~nxf"