count(scandir($dir)) === 2 (僅含 . 和 ..)。rmdir() 刪除。<?php
function rm_empty_dir($path) {
if (!is_dir($path) || !($handle = opendir($path))) return;
while (($file = readdir($handle)) !== false) {
if ($file === '.' || $file === '..') continue;
$cur = $path . '/' . $file;
if (is_dir($cur)) {
rm_empty_dir($cur); // 先處理子目錄
if (count(scandir($cur)) === 2) {
rmdir($cur);
echo "Deleted empty dir: $cur\n";
}
}
}
closedir($handle);
}
// 使用
rm_empty_dir('/target/folder');
find /target/folder -mindepth 1 -depth -type d -empty -exec rmdir {} \;
-mindepth 1:不刪除起始目錄本身。-depth:深度優先 (先處理子目錄)。-type d -empty:僅匹配空目錄。-exec rmdir {} \;:執行刪除。| 維度 | PHP 遞歸 | Shell find |
|---|---|---|
| 跨平台 | ✅ Windows/Linux 通用 | ❌ 需 Unix 環境 |
| 大量目錄 | 遞歸深度受限、較慢 | ✅ C 底層、極快 |
| 權限控制 | PHP 進程權限 | Shell 使用者權限 |
| 錯誤處理 | 可捕獲例外、記錄日誌 | 需重導向 stderr |
function rm_empty_dir_ex($path, array $preserve = ['.git','vendor','node_modules']) {
$base = basename($path);
if (in_array($base, $preserve)) return;
// ... 同前邏輯
}
PHP 遞歸 scandir + rmdir 邏輯清晰、跨平台,適合應用層整合;Shell find -empty -exec rmdir 效能極佳,適合維護腳本、CI/CD 清理階段。根據執行環境與需求選擇即可。