
你是否有過這種經歷?
某個平靜的清晨,你正端著咖啡準備開啟美好的一天,突然監報系統傳來刺眼的紅字警告:
[CRITICAL] Server Disk Space Usage: 99.8% !!!
你心裡一驚,打開伺服器一查,罪魁禍首不出所料——又是那些默默囤積、永無止境的 DB 備份檔(.bak)!
為了防止「伺服器暴斃」與「半夜被叫醒維護」的悲劇發生,今天我們就來聊聊怎麼用 Python 寫出一個聰明、安全又省心的 「.bak 檔案自動清理神器」!
💣 備份檔的「膨脹魔咒」:為什麼硬碟總是不夠用?
在 IT 與開發者的日常裡,資料庫備份是我們的生命線。「每天備份一次」是基本常識,甚至有些高頻系統每小時都在備份。
一個每日 1GB 的 DB 備份檔,聽起來好像還好對吧?
- 1 天 = 1 GB
- 1 個月 = 30 GB
- 半年 = 180 GB!
- 1 年 = 365 GB!
如果你有好幾個資料庫,再加上歷史累積,硬碟空間很快就會像連假期間的高速公路一樣——卡到爆!
最可怕的是,許多系統管理者往往都是在硬碟被塞爆、服務掛掉的那一刻,才驚覺原來半年前的備份檔還躺在那裡吸血。
🦸♂️ 拯救硬碟!「備份檔終結者」腳本上陣
為了避免「手動刪檔刪到手軟」或是「誤刪最新備份直接準備提頭來見」,我們需要一個具備以下特性的自動化腳本:
- 預設安全機制(Dry-Run):先預覽「會刪哪些檔」,確認無誤再真的動手,安全感滿分!
- 彈性門檻設定:預設保留 180 天,但也支援隨時調整成 30 天或 90 天。
- 明確的視覺回饋:清楚標示每個檔案過期了多久(例如:
185.2 天前),不再瞎猜。
💻 靈魂核心程式碼
來看看這個輕巧又強大的 Python 腳本(clean_bak.py):
# -*- coding: utf-8 -*-
import argparse
import sys
import time
from pathlib import Path
def cleanup_bak_files(
target_dir: str, days: int = 180, execute_delete: bool = False
) -> None:
target_path = Path(target_dir).resolve()
if not target_path.exists() or not target_path.is_dir():
print(f" 錯誤:目標目錄 '{target_path}' 不存在。")
sys.exit(1)
now = time.time()
files_found = 0
files_matched = 0
mode_label = (
"【實際刪除模式】" if execute_delete else "【模擬預覽模式 (Dry-Run)】"
)
print(f" 目標目錄: {target_path}")
print(f" 保留天數門檻: {days} 天")
print(f" 執行模式: {mode_label}\n" + "-" * 60)
# 搜尋目錄下的所有 .bak 檔案
for file_path in target_path.glob("*.bak"):
files_found += 1
mtime = file_path.stat().st_mtime
file_age_days = (now - mtime) / 86400
if file_age_days > days:
files_matched += 1
age_formatted = f"{file_age_days:.1f} 天前"
if execute_delete:
try:
file_path.unlink()
print(
f" [已刪除] {file_path.name} (修改時間: {age_formatted})"
)
except Exception as e:
print(f" [刪除失敗] 無法刪除 {file_path.name}: {e}")
else:
print(
f" [將會刪除] {file_path.name} (修改時間: {age_formatted})"
)
print("-" * 60)
if not execute_delete:
print(
f" 預覽結束:在 {files_found} 個 `.bak` 檔案中,發現 {files_matched} 個超過 {days} 天老舊檔案。"
)
if files_matched > 0:
print(" 若要真正刪除這些檔案,請加上 `--delete` 參數重新執行!")
else:
print(
f" 清理完成:已成功釋放空間!刪除了 {files_matched} 個過期檔案。"
)
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="預覽或刪除超過指定天數的 .bak 備份檔案。"
)
parser.add_argument(
"directory",
nargs="?",
default=".",
help="備份檔案所在的目錄路徑(預設為目前目錄)",
)
parser.add_argument(
"--days",
type=int,
default=180,
help="檔案保留天數上限(預設:180 天)",
)
parser.add_argument(
"--delete",
action="store_true",
help="加入此參數以進行「實際刪除」操作",
)
args = parser.parse_args()
cleanup_bak_files(args.directory, days=args.days, execute_delete=args.delete)
🛠️ 實戰演練:三步驟教你輕鬆上手
1️⃣ 第一步:演習比實戰重要!先來個「預覽演練」
預設狀態下,腳本只會「看」不會「刪」。直接執行腳本,看看有哪些老古董檔案準備該下架:
python clean_bak.py /var/backups/portal
輸出結果超清晰:
🎯 目標目錄: /var/backups/portal
⏳ 保留天數門檻: 180 天
⚙️ 執行模式: 🛡️【模擬預覽模式 (Dry-Run)】
------------------------------------------------------------
👀 [將會刪除] portal_backup_2026_01_01_000000.bak (修改時間: 220.4 天前)
------------------------------------------------------------
💡 預覽結束:在 25 個 `.bak` 檔案中,發現 1 個超過 180 天老舊檔案。
👉 若要真正刪除這些檔案,請加上 `--delete` 參數重新執行!
執行畫面:

懶的每次打字, 增加2個 bat file:
check_files.bat
python clean_bak.py "D:\backup\portal"
pause
confirm_delete.bat
python clean_bak.py "D:\backup\portal" --delete
pause
2️⃣ 第二步:確定無誤,開火刪除!
確認過清單後,加上 --delete 參數,給過期檔案來個大掃除:
python clean_bak.py /var/backups/portal --delete
瞬間,硬碟空間就回歸綠色健康狀態,空氣都變得新鮮了!
3️⃣ 第三步:交給排程工具,一勞永逸!
工程師的終極目標就是「能自動化就絕不手動」。設定好 Linux Crontab 或 Windows 工作排程器,讓伺服器每天半夜自動執行清理:
- Linux (Crontab):
0 2 * * * /usr/bin/python3 /path/to/clean_bak.py /var/backups/portal --delete >> /var/log/clean_bak.log 2>&1每天凌晨 02:00 自動掃描並清理,還會把紀錄寫進 log 檔,安心度 100%!
💡 經驗談:備份維護的黃金法則
- 離線/異地備份才是真愛:本地端只保留近 30~180 天的快取備份,更久遠的歷史資料請定期同步至 AWS S3、Google Cloud Storage 或冷儲存(Glacier)。
- 權限控管要做好:確保執行清理腳本的系統帳號只有該目錄的權限,避免權限過大衍生安全風險。
- 定期測試還原:能還原的備份才叫備份,不能還原的只是佔空間的垃圾! 記得定期做備份還原演練喔!
Windows 工作排程器 如何使用
1.開啟工作排程器:快捷鍵組合。
按下鍵盤上的 Win 鍵與 R 鍵開啟執行視窗,輸入 taskschd.msc 後按下 Enter 鍵,就能直接開啟工作排程器介面。
透過這個方式可以最快速進入管理頁面。
2.建立基本工作:右側操作區。
點選右側動作面板中的建立基本工作,接著輸入這個工作的名稱與相關說明,完成後點選下一步。
名稱建議使用容易識別的文字,方便日後維護。
3.設定觸發程序:觸發條件。
選擇希望這個工作執行的頻率,例如每天、每週、每月或是當電腦開機時,選擇完畢後點選下一步,並設定具體的執行時間點。
確認時間與頻率設定正確,確保排程能按時運作。
4.設定動作:執行項目。
選擇啟動程式,點選下一步後,點選瀏覽按鈕來選擇想要自動執行的程式檔案、批次檔(.bat)或腳本,設定完成後點選下一步。
可以選擇系統內建的應用程式,或是自己寫好的自動化腳本。
5.確認與完成:核對資訊。
檢查摘要頁面上的所有設定是否正確,確認無誤後點選完成,這個自動化工作就會正式加入排程中。
列表會隨即更新,顯示剛剛建立的新工作。

設定好之後, 每天就會自動刪除 log.