😱 救命!硬碟又被吃光了!用 Python 打造「自動刪除備份檔」

你是否有過這種經歷?

某個平靜的清晨,你正端著咖啡準備開啟美好的一天,突然監報系統傳來刺眼的紅字警告:

[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!

如果你有好幾個資料庫,再加上歷史累積,硬碟空間很快就會像連假期間的高速公路一樣——卡到爆!

最可怕的是,許多系統管理者往往都是在硬碟被塞爆、服務掛掉的那一刻,才驚覺原來半年前的備份檔還躺在那裡吸血。

🦸‍♂️ 拯救硬碟!「備份檔終結者」腳本上陣

為了避免「手動刪檔刪到手軟」或是「誤刪最新備份直接準備提頭來見」,我們需要一個具備以下特性的自動化腳本:

  1. 預設安全機制(Dry-Run):先預覽「會刪哪些檔」,確認無誤再真的動手,安全感滿分!
  2. 彈性門檻設定:預設保留 180 天,但也支援隨時調整成 30 天或 90 天。
  3. 明確的視覺回饋:清楚標示每個檔案過期了多久(例如: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 CrontabWindows 工作排程器,讓伺服器每天半夜自動執行清理:

  • 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%!

💡 經驗談:備份維護的黃金法則

  1. 離線/異地備份才是真愛:本地端只保留近 30~180 天的快取備份,更久遠的歷史資料請定期同步至 AWS S3、Google Cloud Storage 或冷儲存(Glacier)。
  2. 權限控管要做好:確保執行清理腳本的系統帳號只有該目錄的權限,避免權限過大衍生安全風險。
  3. 定期測試還原能還原的備份才叫備份,不能還原的只是佔空間的垃圾! 記得定期做備份還原演練喔!

Windows 工作排程器 如何使用

1.開啟工作排程器:快捷鍵組合。

按下鍵盤上的 Win 鍵與 R 鍵開啟執行視窗,輸入 taskschd.msc 後按下 Enter 鍵,就能直接開啟工作排程器介面。

透過這個方式可以最快速進入管理頁面。

2.建立基本工作:右側操作區。

點選右側動作面板中的建立基本工作,接著輸入這個工作的名稱與相關說明,完成後點選下一步。

名稱建議使用容易識別的文字,方便日後維護。

3.設定觸發程序:觸發條件。

選擇希望這個工作執行的頻率,例如每天、每週、每月或是當電腦開機時,選擇完畢後點選下一步,並設定具體的執行時間點。

確認時間與頻率設定正確,確保排程能按時運作。

4.設定動作:執行項目。

選擇啟動程式,點選下一步後,點選瀏覽按鈕來選擇想要自動執行的程式檔案、批次檔(.bat)或腳本,設定完成後點選下一步。

可以選擇系統內建的應用程式,或是自己寫好的自動化腳本。

5.確認與完成:核對資訊。

檢查摘要頁面上的所有設定是否正確,確認無誤後點選完成,這個自動化工作就會正式加入排程中。

列表會隨即更新,顯示剛剛建立的新工作。

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *