批处理脚本:如何递归删除目录中除点开头文件/文件夹外的所有内容?
批处理实现递归清空src目录但保留隐藏项的简洁方案
我来给你梳理几个简洁的批处理写法,刚好能满足你的需求:递归删除src目录里的内容,但保留所有以.开头的文件(比如.gitignore)和文件夹(比如.git、.vscode),子目录的规则不用严格遵循也没关系。
方法一:逻辑清晰的分步骤处理(推荐)
创建一个.bat文件,把下面的代码贴进去就行:
@echo off set "targetDir=src" :: 递归删除所有非隐藏文件(自动跳过以.开头的隐藏文件) del /s /q /f "%targetDir%\*" :: 递归删除src下的非隐藏顶层目录(连带目录里的所有内容) for /d /r "%targetDir%" %%d in (*) do ( if "%%~dpd"=="%targetDir%\" ( rd /s /q "%%d" ) )
命令拆解:
del /s /q /f "%targetDir%\*":/s:递归处理所有子目录里的文件/q:安静模式,无需每次确认删除/f:强制删除只读文件- 核心逻辑:Windows中以
.开头的文件默认是隐藏属性,*通配符不会匹配它们,所以这条命令只会删除非隐藏文件,自动保留.gitignore这类目标文件。
for /d /r "%targetDir%" %%d in (*):- 遍历
src下的所有子目录,通过%%~dpd判断是否为src的直接子目录,是的话就用rd /s /q递归删除整个目录——这样就保留了.git、.vscode这类以.开头的顶层目录。
- 遍历
方法二:更简洁的极简写法(适合子目录完全不用管的情况)
如果子目录里的内容可以随意删除,只要保证src顶层的.开头项保留就行,那可以用更短的代码:
@echo off pushd src || exit /b :: 递归删所有非隐藏文件 del /s /q /f * :: 删src下所有非隐藏顶层目录(连带内容) for /d %%d in (*) do rd /s /q "%%d" popd
这个写法更清爽:
pushd src:直接进入src目录,避免路径写错的问题del /s /q /f *:和上面逻辑一致,自动跳过隐藏文件,递归删除其他文件for /d %%d in (*):只遍历src当前目录下的非隐藏子目录,一键删除整个目录及其内容popd:回到原来的工作目录
小提醒
测试的时候可以先把del改成echo del,rd改成echo rd,先预览要删除的内容,避免误删重要文件哦!
内容的提问来源于stack exchange,提问作者ribbanya
相关产品推荐
相关产品推荐

