compare_update_diff.py ドキュメント

概要

compare_update_diff.py は、2つのディレクトリツリーを再帰的に比較し、ファイルの変更点(作成、更新、削除)を抽出してレポートを出力するユーティリティスクリプトです。指定したディレクトリ間の差分をログファイルおよび標準出力に記録し、更新されたファイルについてはテキストベースのコンパクトな差分(diff)を生成します。

動作原理

指定された古いディレクトリと新しいディレクトリをスキャンし、指定されたファイルマスクに一致するファイルを収集します。ファイルの相対パスと更新日時(タイムスタンプ)を比較し、以下のルールに基づいて判定を行います。

  • 新しいディレクトリにのみ存在するファイル: created (新規作成)として報告されます。

  • 両方のディレクトリに存在し、新しいディレクトリの方がタイムスタンプが新しいファイル: updated (更新)として報告され、変更内容のコンパクトな差分が出力されます。

  • 古いディレクトリにのみ存在するファイル: deleted (削除)として報告されます。

  • 状態に変更がない、または古いディレクトリの方が新しい場合: 報告されません。

テキストファイルの読み込み時には、文字コードとして utf-8-sig、utf-8、cp932 の順にデコードを試みます。これらに失敗した場合は、置換文字を用いた utf-8 で読み込むフォールバック機構を備えており、文字コードが混在する環境でも差分生成処理を継続できる堅牢な仕様となっています。

入出力仕様

入力(CLIオプション)

本プログラムはコマンドライン引数として以下の指定を受け付けます。

  • 位置引数

    • 第1引数 (old_dir): 古い/基準となるディレクトリツリー

    • 第2引数 (new_dir): 新しい/現在となるディレクトリツリー

  • オプション引数

    • --filemask, -m: 比較対象のファイルマスク。セミコロン (;) 区切りで複数指定が可能です(デフォルト: *.py)

    • --log, -l: 出力するログファイルのパス(デフォルト: update.log)

    • --progress: スキャン中の進捗表示の更新間隔(秒)。0 を指定すると定期的な進捗表示が無効になります(デフォルト: 1.0)

    • --no-diff: 更新されたファイルの差分出力(diff)を無効化します

    • --diff-context: 差分出力時に変更行の前後何行のコンテキスト(未変更行)を残すかを指定します(デフォルト: 2)

    • --version: バージョン情報を表示します

出力

  • 標準出力: ヘッダー情報、判定されたファイルの変更履歴、差分(diff)情報、およびディレクトリのスキャン進捗状況がコンソールに出力されます。

  • ログファイル: 判定結果や差分情報を含むレポート全体が、指定されたログファイル(デフォルトは update.log)にUTF-8エンコーディングで保存されます。

非標準ライブラリ

インポートされているモジュール(argparse, difflib, fnmatch, os, sys, time, datetime, pathlib)はすべて Python の標準ライブラリであり、外部の非標準ライブラリへの依存はコードからは確認できません。

実行例

基本的な比較の実行(古いディレクトリと新しいディレクトリを比較し、デフォルト設定でログを出力):

python compare_update_diff.py old_dir new_dir

比較対象のファイルを拡張子 .py と .pl に限定して実行:

python compare_update_diff.py old_dir new_dir --filemask "*.py;*.pl"

指定したカスタムログファイルに結果を保存:

python compare_update_diff.py old_dir new_dir --log custom_update.log

進捗表示の更新間隔を2秒に設定:

python compare_update_diff.py old_dir new_dir --progress 2

差分出力のコンテキスト行数(変更箇所の前後の行数)を増やして実行:

python compare_update_diff.py old_dir new_dir --diff-context 4

差分(diff)の詳細を出力せずに、ファイルの変更リストのみを生成:

python compare_update_diff.py old_dir new_dir --no-diff