如何在Windows中用CMD/PowerShell通过正则匹配批量删除文件?
问题场景
Windows电脑中有一个包含子文件夹的文件夹,里面的图片文件名格式如下:
- first-image-name.jpg(需保留的原文件)
- first-image-name-72x72.jpg
- first-image-name-150x150.jpg
- first-image-name-250x250.jpg
- first-image-name-300x300.jpg
- first-image-name-400x400.jpg
- first-image-name-1024x1024.jpg
- second-image-name.png(需保留的原文件)
- second-image-name-72x72.png
- second-image-name-150x150.png
- second-image-name-250x250.png
- second-image-name-300x300.png
- second-image-name-400x400.png
- second-image-name-1024x1024.png
需求:删除所有带尺寸标识的图片,仅保留原文件,且需要递归处理子文件夹。
用户尝试了以下命令但均失效:
Windows PowerShell命令
Get-ChildItem $Path | Where{$_.Name -Match '.*[0-9]+x[0-9]+.\(jpg\|png\|jpeg\)$'} | Remove-Item
Windows CMD命令
find -type f -regex '.*[0-9]+x[0-9]+.\(jpg\|png\|jpeg\)$' -delete
find -name '.*[0-9]+x[0-9]+.\(jpg\|png\|jpeg\)$' -delete
命令问题分析
PowerShell命令的问题
- 正则表达式错误:
- 匹配文件名后缀的
.是正则通配符,需转义为\.才能匹配实际的点号; - PowerShell的
-Match使用.NET正则规则,括号()和管道符|无需用反斜杠转义,原命令的\(jpg\|png\|jpeg\)写法错误,应改为(jpg|png|jpeg); - 遗漏了尺寸标识前的横杠
-,目标文件名格式为xxx-72x72.jpg,正则未匹配该横杠会导致误判或漏判。
- 匹配文件名后缀的
- 缺少递归参数:默认
Get-ChildItem仅处理当前目录,需添加-Recurse参数才能遍历子文件夹。 - 未限定文件类型:未加
-File参数可能误操作文件夹,建议补充该参数。
CMD命令的问题
Windows CMD自带的find是文本内容搜索工具,和Linux的文件查找find命令完全不同,你用的Linux find语法在CMD中完全不生效。
正确的命令实现
PowerShell 正确命令
# 替换$Path为你的目标文件夹路径,比如"C:\Images" Get-ChildItem $Path -File -Recurse | Where-Object {$_.Name -match '.*-\d+x\d+\.(jpg|png|jpeg)$'} | Remove-Item -WhatIf
- 保留
-WhatIf可预览要删除的文件,确认无误后再移除该参数执行实际删除; - 正则
.*-\d+x\d+\.(jpg|png|jpeg)$精准匹配以-数字x数字.后缀结尾的文件,避免误删原文件。
CMD 正确命令
CMD中用for循环结合正则匹配实现递归删除:
:: 替换为你的目标文件夹路径,比如C:\Images for /r "你的文件夹路径" %f in (*-*x*.*) do ( echo %f | findstr /r ".*-[0-9]*x[0-9]*\.(jpg\|png\|jpeg)$" >nul && del "%f" )
/r参数实现递归遍历子文件夹;- 可先将
del "%f"改为echo "%f"预览待删除文件,确认后再替换回del执行删除。
内容的提问来源于stack exchange,提问作者Muhammad Hassan
相关产品推荐
相关产品推荐

