🐍

Pythonで差分ファイルの抽出

2022/11/18に公開

これ何?

2つのディレクトリから差分ファイルのパス一覧を生成するスクリプト

作った経緯

"差分ファイル"と"追加ファイル"のみ"ディレクトリ構造を維持したまま"抽出したい。
しかしいい感じのツールが見つからない(需要はありそうだが)。
さて困った。
幸いにもPythonに良いモジュールが提供されていたのでスクリプトを自作することにした。

import filecmp
import sys

# e.g.
# python3 extract_diff_path.py bbb aaa |xargs -I{} cp --parents -r {} extract/
def extract_diff_path(a, b):

  def fn(dcmp,current_dir=a, buf=[]):
    # カレントディレクトリのパスとオブジェクト名を結合する
    buf.extend([f"{current_dir}/{x}" for x in dcmp.left_only])
    buf.extend([f"{current_dir}/{x}" for x in dcmp.diff_files])
    items = dcmp.subdirs.items()
    # 配下に差分のあるディレクトリが存在しない
    if not items:
      return 
    for k,v in items:
      fn(v,f"{current_dir}/{k}",buf)
    return buf

  return fn(filecmp.dircmp(a, b))

if __name__ == '__main__':
  for x in extract_diff_path(sys.argv[1], sys.argv[2]):
    print(x)

解説

filecmpはファイルやディレクトリのdiffを取るモジュール。
これを使用して2つのディレクトリの差分をリストアップし、その中にディレクトリが含まれていた場合は再度同じ処理を実施する。
終端までたどり着いたら差分のリストを返却し、最終的に差分のパス一覧が出来上がるという仕組み。

筆者はスクリプトの戻り値をcpコマンドなどに喰わせて使用しています。

Discussion