在終端機刪除包含檔案與子目錄的非空目錄,最常用的是 rm -rf。但這指令極具破壞力,稍有不慎即造成資料永久遺失。本文詳解參數含義、實戰範例、風險場景與更安全的替代工具。
rm -rf 目錄名稱
| 參數 | 全名 | 功能 |
|---|---|---|
-r / -R | recursive | 遞迴刪除目錄及其所有內容(子目錄、檔案) |
-f | force | 強制刪除:忽略不存在的檔案、不提示確認、忽略寫入保護 |
# 刪除當前目錄下的 zezehost.com 目錄及所有內容 rm -rf zezehost.com # 刪除多個目錄 rm -rf dir1 dir2 dir3 # 使用絕對路徑(較安全,避免誤刪) rm -rf /var/www/old_site
| 危險操作 | 後果 | 預防措施 |
|---|---|---|
rm -rf / | 刪除整個根檔案系統(現代 coreutils 有 --preserve-root 防護) | 絕對不要在 root 目錄下執行,使用 --preserve-root |
rm -rf * 在錯誤目錄 | 刪除當前目錄所有內容 | 執行前先 ls 確認,或用 pwd 確認路徑 |
變數為空 rm -rf $DIR/ | 變成 rm -rf / | 寫腳本時加檢查:[ -n "$DIR" ] && [ -d "$DIR" ] && rm -rf "$DIR" |
| 符號連結陷阱 | 刪除連結指向的真實目標內容 | 對目錄用 rm -rf 會進入連結內部刪除,需留意 |
| 生產環境手滑 | 服務中斷、資料遺失 | 先備份、用 LVM 快照、測試環境驗證腳本 |
# 安裝 apt install trash-cli # Debian/Ubuntu dnf install trash-cli # Fedora/RHEL # 使用 trash-put 目錄名稱 # 列出垃圾桶 trash-list # 還原 trash-restore # 清空垃圾桶 trash-empty
支援 alias rm=trash-put 但不建議,會改變標準指令行為,導致腳本異常。
alias rm='rm -i' alias mv='mv -i' alias cp='cp -i'
每次刪除需輸入 y 確認,大幅降低誤刪機率。
# 模擬同步刪除(不實際刪除) rsync -av --delete --dry-run /source/ /destination/
#!/bin/bash
set -euo pipefail
TARGET_DIR="/var/www/old_site"
# 1. 變數非空檢查
if [[ -z "$TARGET_DIR" ]]; then
echo "錯誤:目標目錄變數為空"
exit 1
fi
# 2. 目錄存在檢查
if [[ ! -d "$TARGET_DIR" ]]; then
echo "錯誤:目錄不存在:$TARGET_DIR"
exit 1
fi
# 3. 關鍵路徑防護
if [[ "$TARGET_DIR" == "/" || "$TARGET_DIR" == "/home" || "$TARGET_DIR" == "/var" ]]; then
echo "錯誤:拒絕刪除系統關鍵目錄"
exit 1
fi
# 4. 顯示將刪除內容並二次確認
echo "即將刪除以下目錄及其所有內容:"
echo " $TARGET_DIR"
echo "大小:$(du -sh "$TARGET_DIR" | cut -f1)"
read -p "確定要刪除嗎?輸入 'YES' 確認:" CONFIRM
if [[ "$CONFIRM" != "YES" ]]; then
echo "已取消"
exit 0
fi
# 5. 執行刪除
rm -rf "$TARGET_DIR"
echo "刪除完成"
rm -rf 在百萬級小檔案目錄極慢(inode 遍歷、目錄項刪除)。替代方案:
# 方法 1:重新格式化分區(最快,適用於整個分區專用於該目錄)
# umount /mnt/data
# mkfs.ext4 /dev/sdXn
# mount /dev/sdXn /mnt/data
# 方法 2:使用 find + xargs 並行刪除
find /path/to/dir -type f -print0 | xargs -0 -P 8 -n 100 rm -f
find /path/to/dir -type d -empty -delete
# 方法 3:Perl 刪除(比 rm 快)
perl -e 'for(<*>){unlink}' # 當前目錄檔案
# 目錄遞迴需配合 File::Find 模組
rm -rf 是核武級指令:執行前三思、確認路徑、備份關鍵資料。alias rm='rm -i' 習慣。trash-cli 或備份機制,而非直接 rm。