本文目录导读:

- 方案一:Linux / macOS (Bash Shell 脚本)
- 方案二:Windows (Batch 脚本 .bat)
- 方案三:Windows (PowerShell 脚本 .ps1)
- 自动化运行(定时任务)
- 安全建议
- 总结建议
Linux / macOS (Bash Shell 脚本)
这是最常用且强大的方案,利用 find 命令递归查找并删除空目录。
基础版本(清理指定目录下的空目录)
#!/bin/bash
# 定义要清理的目标目录
TARGET_DIR="/path/to/your/directory"
# 检查目录是否存在
if [ ! -d "$TARGET_DIR" ]; then
echo "错误:目录 $TARGET_DIR 不存在"
exit 1
fi
echo "开始清理空目录:$TARGET_DIR"
# 核心命令:
# - find 查找目录
# - -type d 只找目录
# - -empty 匹配空目录
# - -delete 直接删除找到的目录
find "$TARGET_DIR" -type d -empty -delete
# 或者更安全的做法(先打印再删除):
# find "$TARGET_DIR" -type d -empty -print -delete
echo "清理完成。"
执行方法:
# 赋予执行权限 chmod +x clean_empty_dirs.sh # 运行脚本 ./clean_empty_dirs.sh
递归清理版本(处理后可能产生新的空目录)
上面的基础版本只执行一次,如果删除子目录后,父目录变为空,需要多次运行,此版本会反复清理直到没有空目录:
#!/bin/bash
TARGET_DIR="/path/to/your/directory"
if [ ! -d "$TARGET_DIR" ]; then
echo "错误:目录不存在"
exit 1
fi
echo "递归清理空目录:$TARGET_DIR"
# 循环直到没有空目录被删除
while [ -n "$(find "$TARGET_DIR" -type d -empty -print -quit)" ]; do
echo "发现空目录,开始删除..."
find "$TARGET_DIR" -type d -empty -delete
done
echo "所有空目录已清理完毕。"
排除特殊目录(安全增强)
如果您不想删除某些特定名称的空目录(.gitkeep、logs),可以这样做:
#!/bin/bash
TARGET_DIR="/path/to/your/directory"
# 使用 -not -name 排除特定名称的目录
# 排除所有名为 "logs" 或 ".git" 的空目录
find "$TARGET_DIR" -type d -empty \
-not -name "logs" \
-not -name ".git" \
-not -name "node_modules" \
-delete
Windows (Batch 脚本 .bat)
Windows 原生没有 find 的 -empty 参数,需要使用 for /f 循环结合 dir 判断。
基础版本(清理 C:\Temp 下的空目录)
创建一个名为 clean_empty_dirs.bat 的文件:
@echo off
chcp 65001 >nul REM 设置 UTF-8 编码,避免中文乱码
setlocal enabledelayedexpansion
:: 设置目标目录
set "TARGET_DIR=C:\Temp"
:: 检查目录是否存在
if not exist "%TARGET_DIR%" (
echo 错误:目录 %TARGET_DIR% 不存在
pause
exit /b 1
)
echo 开始清理空目录:%TARGET_DIR%
:: 使用 dir /ad /s /b 列出所有子目录
:: 使用 /A-D 排除文件,留下目录
for /f "delims=" %%d in ('dir "%TARGET_DIR%" /ad /s /b 2^>nul') do (
:: 检查该目录是否为空(判断目录下是否有任何文件或子目录)
dir /a "%%d" 2>nul | findstr /v "^$" >nul
:: dir 命令输出为空(只有换行符),说明目录为空
if errorlevel 1 (
echo 删除空目录:%%d
rd /q "%%d" 2>nul
)
)
echo 清理完成。
pause
注意:此版本需要多次运行才能清理嵌套的空目录,为了自动反复运行,可以用一个简单的 loop 配合 ping 延迟:
@echo off
chcp 65001 >nul
set "TARGET_DIR=C:\Temp"
:loop
echo 检查并清理...
for /f "delims=" %%d in ('dir "%TARGET_DIR%" /ad /s /b 2^>nul') do (
dir /a "%%d" 2>nul | findstr /v "^$" >nul
if errorlevel 1 (
rd /q "%%d"
)
)
:: 检查是否还有空目录(简单方法:再次扫描,如果没有找到则跳出)
for /f "delims=" %%d in ('dir "%TARGET_DIR%" /ad /s /b 2^>nul') do (
dir /a "%%d" 2>nul | findstr /v "^$" >nul
if errorlevel 1 (
ping -n 2 127.0.0.1 >nul REM 等待1秒
goto loop
)
)
echo 所有空目录已清理完毕。
pause
Windows (PowerShell 脚本 .ps1)
PowerShell 拥有比 Batch 更强大的管道和处理能力,推荐使用。
单行命令(清理当前目录下的所有空目录)
Get-ChildItem -Path "C:\Temp" -Recurse -Directory |
Where-Object { (Get-ChildItem $_.FullName -Force).Count -eq 0 } |
Remove-Item -Force -Recurse
完整脚本(带错误处理和递归清理)
创建一个 clean_empty_dirs.ps1 文件:
param(
[string]$TargetPath = "C:\Temp",
[switch]$WhatIf # 添加 -WhatIf 参数可以预览要删除的目录而不实际删除
)
# 检查目录是否存在
if (-not (Test-Path -Path $TargetPath -PathType Container)) {
Write-Error "目录 $TargetPath 不存在!"
exit 1
}
Write-Host "开始清理空目录:$TargetPath" -ForegroundColor Green
$loopCount = 0
$continue = $true
while ($continue) {
$beforeClean = $continue # 用于判断是否还有空目录
$continue = $false
# 获取所有子目录(不包含目标目录本身)
$emptyDirs = Get-ChildItem -Path $TargetPath -Recurse -Directory -Force |
Where-Object { (Get-ChildItem -Path $_.FullName -Force).Count -eq 0 }
if ($emptyDirs.Count -gt 0) {
Write-Host "第 $($loopCount+1) 轮发现 $($emptyDirs.Count) 个空目录,正在删除..." -ForegroundColor Yellow
foreach ($dir in $emptyDirs) {
if ($WhatIf) {
Write-Host " 将要删除:$($dir.FullName)" -ForegroundColor Cyan
} else {
try {
Remove-Item -Path $dir.FullName -Force -ErrorAction Stop
Write-Host " 已删除:$($dir.FullName)" -ForegroundColor DarkGray
} catch {
Write-Warning " 删除失败:$($_.Exception.Message)"
}
}
}
$continue = $true
$loopCount++
} else {
Write-Host "本轮无空目录。" -ForegroundColor Green
}
# 防止无限循环(最多尝试10轮)
if ($loopCount -ge 10) {
Write-Warning "已达到最大尝试次数(10),可能无法完全清理嵌套空目录。"
$continue = $false
}
}
Write-Host "清理完成!共执行 $loopCount 轮清理。" -ForegroundColor Green
执行方法(PowerShell):
# 允许执行脚本(如果受限) Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass # 运行脚本(预览模式) .\clean_empty_dirs.ps1 -TargetPath "C:\YourFolder" -WhatIf # 正式运行 .\clean_empty_dirs.ps1 -TargetPath "C:\YourFolder"
自动化运行(定时任务)
为了让脚本自动定期运行,可以设置定时任务。
Linux (Crontab)
# 编辑 crontab crontab -e # 每天凌晨 3 点运行脚本 0 3 * * * /path/to/clean_empty_dirs.sh > /dev/null 2>&1
Windows (任务计划程序)
- 打开 任务计划程序
- 创建基本任务
- 触发器:选择每天、每周等
- 操作:启动程序
- 对于 Bat 脚本:
C:\path\to\clean_empty_dirs.bat - 对于 PowerShell:
powershell.exe -File "C:\path\to\clean_empty_dirs.ps1" -ExecutionPolicy Bypass
- 对于 Bat 脚本:
安全建议
- 先预览再删除:在生产环境或重要目录使用前,先使用
-print(Linux) 或-WhatIf(PowerShell) 查看要删除的目录。 - 谨慎包含
.gitkeep等标记文件:有些目录需要保留,即使为空,如果该目录只有一个.gitkeep文件,则脚本会认为它不是空目录,如果您想删除这种伪空目录,请在条件中额外过滤。 - 权限问题:有些目录可能无法删除(被锁或权限不足),脚本应做好错误处理。
- Windows 注意:Windows 系统目录(如
C:\Windows)下的空目录不要随意清理,可能导致系统问题。
总结建议
- Linux 用户:直接用
find /path -type d -empty -delete,简单高效。 - Windows 用户:推荐 PowerShell 脚本,功能更强,处理更灵活。
- 需要定时自动清理:配合系统的定时任务工具(crontab / 任务计划程序)即可。
如果您需要针对特定场景(如清理项目中的空 node_modules 残留等),请告诉我,我可以提供更精细的定制版本。