如何批量遍历目录子文件夹,仅保留最大的*.rst文件并删除其余同类文件
需求实现方案
你原脚本存在两个问题:一是扩展名误写为.rts,和你需要匹配的.rst不符;二是仅包含输出文件名到txt的逻辑,没有按大小排序、删除冗余文件的实现。以下是两种可直接使用的解决方案:
批处理修复方案
操作前请先备份目标目录文件,避免误删。
@echo off setlocal enabledelayedexpansion :: 遍历C:\Temp下所有子目录 for /d %%i in ("C:\Temp\*") do ( set "first=1" :: 按大小降序列出当前目录所有.rst文件,跳过最大的第一个,删除其余 for /f "skip=1 delims=" %%j in ('dir /b /o-s /a-d "%%i\*.rst" 2^>nul') do ( del /f /q "%%i\%%j" ) ) endlocal
参数说明:
dir /o-s:指定按文件大小从大到小排序skip=1:跳过排序后的第一个结果,也就是体积最大的rst文件2>nul:避免目录下没有rst文件时抛出错误提示del /f /q:强制静默删除文件,无需二次确认
测试阶段可以把
del /f /q替换为echo,先预览待删除的文件列表,确认无误后再执行真实删除操作。
更简便的PowerShell方案
如果允许使用PowerShell,实现逻辑更清晰易调整:
# 遍历C:\Temp下所有子目录 Get-ChildItem -Path "C:\Temp" -Directory | ForEach-Object { # 获取当前目录下所有rst文件,按大小降序排序 $rstFiles = Get-ChildItem -Path $_.FullName -Filter "*.rst" -File | Sort-Object Length -Descending # 文件数大于1时,删除除最大文件外的其余文件 if ($rstFiles.Count -gt 1) { $rstFiles | Select-Object -Skip 1 | Remove-Item -Force } }
如果后续需要保留前N个最大的rst文件,仅需修改-Skip 1里的数值即可。
内容的提问来源于stack exchange,提问作者Exi
相关产品推荐
相关产品推荐

