You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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环境下对应盘符路径):

  1. 脚本会标记这两个sink文件夹,以及它们的上级/home/folder/items/、/home/folder/直至根目录。
  2. 所有不在标记列表内的目录都会被删除,目标目录完整保留。

内容的提问来源于stack exchange,提问作者Lex King

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:50:30