rmdir(remove directory)是 Linux 專門用於刪除「空目錄」的指令。雖然 rm -r 也能刪除目錄,但 rmdir 的語義限制(僅限空目錄)反而成為防誤刪的安全機制。本文詳細說明語法、參數、實戰範例,並對比 rm -r 的風險差異,助你精準掌握目錄清理操作。

rmdir [選項]... 目錄...
核心限制:
w 權限)安全提醒:rm -r 目錄會遞迴刪除所有內容,極高風險;rmdir強制要求空目錄,適合腳本中確認清理狀態的防呆機制。
| 參數 | 長參數 | 功能 |
|---|---|---|
| -p | --parents | 遞迴刪除父目錄鏈:若子目錄刪除後父目錄變空,順便刪除父目錄 |
| -v | --verbose | 顯示每個被刪除目錄的名稱 |
| --ignore-fail-on-non-empty | 忽略「目錄非空」錯誤(僅跳過不中斷) |
# 目錄結構
tree
.
├── bin
├── doc
│ ├── info
│ └── product
├── lib
└── logs
├── info
└── product
# 嘗試刪除非空目錄 doc
rmdir doc
# rmdir: 刪除 'doc' 失敗: 目錄非空
# 必須先刪除子目錄
rmdir doc/info
rmdir doc/product
rmdir doc # 成功
# 目錄結構
logs/
└── product
# 直接刪除 logs/product 並順便清理 logs
rmdir -p logs/product
# 輸出(加 -v):
# rmdir: 刪除 'logs/product'
# rmdir: 刪除 'logs'
# 等同於依序執行:
# rmdir logs/product
# rmdir logs
#!/bin/bash
TMP_DIR="/tmp/myapp_$$"
mkdir -p "$TMP_DIR/sub1/sub2"
# ... 處理邏輯 ...
# 安全清理:只有完全空白才會刪除,避免誤刪殘留資料
rmdir -p "$TMP_DIR/sub1/sub2" 2>/dev/null || {
echo "警告:暫存目錄非空,請人工檢查 $TMP_DIR"
exit 1
}
# 刪除專案下所有空目錄(自底向上)
find /path/to/project -type d -empty -delete
# 或顯示後確認
find /path/to/project -type d -empty -print | xargs rmdir -v
# 危險:直接遞迴刪除
rm -rf /tmp/old_project
# 較安全:先清空內容再刪除目錄結構
find /tmp/old_project -mindepth 1 -delete # 刪除所有檔案/子目錄內容
rmdir -p /tmp/old_project # 刪除空目錄結構
| 現象 | 原因 | 解決 |
|---|---|---|
| 顯示「目錄非空」但 ls -A 為空 | 存在隱藏檔(以 . 開頭) | ls -la 確認,rm -f .hidden 清除後再 rmdir |
| 掛載點無法刪除 | 目錄為掛載點或被進程佔用 | umount 或 lsof +D 目錄 找出佔用進程 |
| 權限拒絕 | 無父目錄寫入權限 | chmod u+w 父目錄 或以 root 執行 |
善用 rmdir 的語義約束與 -p 遞迴特性,能建立更安全、可審計的目錄清理流程,是系統管理腳本與自動化維護的優選工具。