编写Batch脚本:保留sink后缀文件夹及上级目录,删除其余
解决方案:批量保留指定文件夹及
sink结尾文件夹的Batch脚本 核心思路
要实现删除所有非目标文件夹,关键是先标记需要保留的目录(指定列表+*sink结尾的文件夹及其所有上级目录),再从最深层级开始删除未被标记的目录,避免误删上级目录。
具体脚本实现
@echo off setlocal enabledelayedexpansion :: 1. 定义需要保留的指定文件夹列表(相对/绝对路径,空格分隔) set "keep_folders=folderA folderB C:\test\special_dir" :: 2. 标记所有以`sink`结尾的文件夹及其上级目录为保留对象 for /d /r . %%d in (*sink) do ( set "dir=%%d" :mark_sink_parents if not defined marked_dirs["!dir!"] ( set "marked_dirs["!dir!"]=1" :: 向上遍历上级目录直到根目录 for %%p in ("!dir!\..") do set "dir=%%~fp" goto mark_sink_parents ) ) :: 3. 标记指定列表中的文件夹及其上级目录 for %%k in (%keep_folders%) do ( set "dir=%%~fk" :mark_specials if not defined marked_dirs["!dir!"] ( set "marked_dirs["!dir!"]=1" for %%p in ("!dir!\..") do set "dir=%%~fp" goto mark_specials ) ) :: 4. 从最深层级开始删除未被标记的目录 for /f "delims=" %%d in ('dir /ad /s /b ^| sort /r') do ( if not defined marked_dirs["%%~fd"] ( rd /s /q "%%d" echo 已删除:%%d ) ) endlocal
脚本关键说明
- 延迟变量扩展:启用
enabledelayedexpansion确保循环中能动态修改、读取变量。 - 递归标记上级目录:对每个目标文件夹,向上遍历标记所有父目录,确保这些层级不会被误删。
- 反向排序删除:用
sort /r让目录从最深到最浅排序,避免先删上级导致子目录无法定位的错误。 - 绝对路径匹配:用
%%~fd和%%~fk统一转为绝对路径,解决相对路径的匹配歧义。
测试验证
针对你给出的示例目录/home/folder/items/kitchen_sink/和/home/folder/items/bathroom_sink/(Windows环境下对应盘符路径):
- 脚本会标记这两个
sink文件夹,以及它们的上级/home/folder/items/、/home/folder/直至根目录。 - 所有不在标记列表内的目录都会被删除,目标目录完整保留。
内容的提问来源于stack exchange,提问作者Lex King
相关产品推荐
相关产品推荐

