このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】ファイルの追加や削除の監視

ファイルの追加や削除の監視

 ファイルの追加や削除を自動的に検知し、管理者が状況を把握できるようにすることは、システム管理や運用の現場で大切な業務の一つです。Pythonには標準ライブラリだけでも簡単にファイル監視を実現できる仕組みがあり、大規模なシステムを導入しなくても素早く試せます。ここでは、ファイル追加・削除の監視プログラムを例に、どのようにして開発・運用していくのかを解説します。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。

1.ファイル監視の概要

 システム管理の一環として、指定したディレクトリ内でファイルが増えたり減ったりするタイミングを把握し、すぐに対処できるようにする手法を「ファイル監視」と呼びます。ファイル監視には以下のようなメリットがあります。

  • 不正なファイル操作の発見
  • システム障害の兆候をいち早くキャッチ
  • 自動バックアップやログ取得などのトリガー処理

1.1.標準ライブラリで実装する利点

 Pythonの標準ライブラリには、ファイルの一覧を取得するglobや、時間待ちを行うtimeといった便利な機能が揃っています。外部モジュールを追加インストールしなくても、すぐに監視プログラムを作り始めることができるため、小規模な運用や学習用のプロトタイプに最適です。

1.2.集合型を使った差分検出

 ファイル監視をシンプルに実現するコツは、現在のファイル一覧と前回のファイル一覧を比較して、その差分を取ることです。Pythonのセット(set型)は集合演算が可能で、差集合(A - B)を直感的に扱えます。

  • 追加されたファイル:新しい一覧 ー 古い一覧
  • 削除されたファイル:古い一覧 ー 新しい一覧

2.ファイル監視プログラムの作成

 ここからは、実際のサンプルコードを紹介しながら、ファイル監視プログラムを構築していきます。このプログラムは、指定したディレクトリ(カレントディレクトリ)のファイル変化を、数秒おきに確認して、追加・削除を検出します。

2.1.基本構成

監視プログラムは、次のような流れで動作します。

  1. カレントディレクトリのファイル一覧を最初に取得し、集合として保存する。
  2. 一定時間(例: 5秒)待機する。
  3. 再度ファイル一覧を取得して集合化し、前回との差分を調べる。
  4. 追加されたファイルと削除されたファイルがあれば、標準出力やログに情報を残す。
  5. 旧ファイル一覧を更新し、再び待機して同じ手順を繰り返す。

2.2.サンプルコード

 以下のコードをJupyterLabやPythonスクリプトとして実行すると、カレントディレクトリで発生するファイルの追加・削除を自動的に検知し、ログファイルへ書き込みます。停止したい場合は、JupyterLabの「停止ボタン」またはCtrl + Cなどで割り込みを行ってください。

import glob
import time
from datetime import datetime

def monitor_directory(interval=5, log_file="file_events.log"):
    """
    カレントディレクトリを監視し、ファイルの追加や削除があればログに書き込む関数。
    interval: 監視間隔を秒単位で指定(デフォルト5秒)。
    log_file: 変更内容を書き込むログファイル名を指定(デフォルト file_events.log)。
    """
    # 起動時点のファイル一覧をセットに変換
    old_state = set(glob.glob("*"))
    
    print("監視を開始しました。停止する場合はカーネルを中断してください。")
    try:
        # 永続的にファイルを監視
        while True:
            time.sleep(interval)
            
            # 最新のファイル一覧を取得
            new_state = set(glob.glob("*"))
            
            # 追加されたファイルの一覧
            added = new_state - old_state
            # 削除されたファイルの一覧
            removed = old_state - new_state
            
            if added or removed:
                now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                # ログファイルを追記モードで開く
                with open(log_file, "a", encoding="utf-8") as f:
                    if added:
                        message = f"[{now}] ADDED   : {', '.join(added)}"
                        f.write(message + "\n")
                        print(message)
                    if removed:
                        message = f"[{now}] REMOVED : {', '.join(removed)}"
                        f.write(message + "\n")
                        print(message)
            
            # 次の比較のため、古い状態を更新
            old_state = new_state
            
    except KeyboardInterrupt:
        print("\n監視を終了しました。ログが", log_file, "に保存されています。")

# 実際に関数を呼び出して監視を始める
monitor_directory(interval=5, log_file="file_events.log")

実行結果

監視を開始しました。停止する場合はカーネルを中断してください。
[2025-03-03 23:05:32] ADDED   : 新規 テキスト ドキュメント.txt
[2025-03-03 23:05:37] ADDED   : file_events.log
[2025-03-03 23:05:47] ADDED   : 新規 テキスト ドキュメント (2).txt
[2025-03-03 23:06:02] REMOVED : 新規 テキスト ドキュメント.txt

監視を終了しました。ログが file_events.log に保存されています。

3.ログファイルへの出力

 上記のコードでは、変更内容が見つかったタイミングでログファイル(デフォルトはfile_events.log)に時刻・操作内容・ファイル名を追記しています。

  • ADDED: 新規に追加されたファイル名
  • REMOVED: 削除されたファイル名
    ログを確認すれば、いつどのファイルが操作されたかを振り返ることができ、トラブルシューティングや不正操作対策に役立ちます。

4.拡張アイデア

ファイル監視はさまざまな形で発展させられます。

  • 特定拡張子のみ監視glob.glob("*.log")などに変えて、一部ファイルだけ監視する。
  • メール通知: 追加や削除があったら管理者にメールを送る処理を組み込む。
  • イベントドリブンの監視: Linuxのinotify、Windowsのwin32fileなどを活用し、リアルタイムにファイル変更を検知する(標準ライブラリ外のモジュール利用)。
  • ディレクトリの多階層監視: サブディレクトリも含めて再帰的にファイルを検出するように拡張する。

まとめ

 ファイルの追加や削除を監視するプログラムを作ることで、システムの状態を可視化しやすくなり、不正操作や障害兆候の早期発見につながります。ここで紹介したサンプルプログラムは、標準ライブラリを使用してシンプルに実装しているため、導入のハードルが低く、すぐに実験できます。さらに改良を重ねることで、メール通知やイベントドリブンなど、より高度な監視システムへと発展させることも可能です。