標準庫 shutil.rmtree() 已完美支援非空目錄刪除,但理解底層實現有助於定制需求(如過濾、日誌、權限處理)。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys
def remove_path(path):
if os.path.isdir(path):
for root, dirs, files in os.walk(path, topdown=False):
for name in files:
file_path = os.path.join(root, name)
os.remove(file_path)
print("Deleted file:", file_path)
for name in dirs:
dir_path = os.path.join(root, name)
os.rmdir(dir_path)
print("Deleted dir:", dir_path)
os.rmdir(path)
print("Deleted root dir:", path)
else:
os.remove(path)
print("Deleted file:", path)
if __name__ == "__main__":
if len(sys.argv) > 1:
for arg in sys.argv[1:]:
remove_path(arg)
else:
print("Usage: rm.py path1 path2 ...")
os.walk(topdown=False):後序遍歷,先處理最深層檔案/目錄,再向上刪除父目錄,避免「目錄非空」錯誤os.remove() 刪除檔案,os.rmdir() 刪除空目錄try/except OSError 記錄權限不足、檔案被佔用等錯誤# Python 3.12+ 推薦
import shutil
shutil.rmtree(path, ignore_errors=False, onerror=handle_error)
# 需保留根目錄僅清空內容
for item in os.scandir(path):
if item.is_file():
os.remove(item.path)
else:
shutil.rmtree(item.path)
os.walk 預設不跟隨,shutil.rmtree 會刪除連結本身而非目標\\?\ 前綴或設定註冊表 LongPathsEnabled