本文目录导读:

- 方案一: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 残留等),请告诉我,我可以提供更精细的定制版本。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播