kiyo_hikoのブログ

メモ+日記?

複雑なフォルダー階層から異なるファイルだけを見つける

WinMergeとかでやるのもしんどくなるぐらい大量のフォルダー階層AとBを比較したい。
かつ、AとB全体で異なるファイルが数個とか数十個とか、大した数無い。
…といった場合に比較が楽になりそうな方法を考えた。

次の方針でAとBからテキストを吐き出して、テキスト比較すればできるはず。

  • ファイルの一覧をすべて引いてくる(これはgci Recurseでよさげ)
  • 取得したファイル名の横にハッシュ値を表示する(Get-FileHashくっつける)
$result = "C:/AforDiff.txt"; # これは例。BならBforDiff.txtなどやっぱりそれっぽい名前に
NullFile $result; # 前のブログエントリー参照

cd A # B分吐くならcd B
foreach ($f in gci . -File -Recurse) {
  $relPath = rvpa -Relative $f.FullName;
  $relPath + "`t" + (Get-FileHash $f.FullName).Hash >> $result;
}

これをAとBでやり、吐かれたテキストを比較します。
変更や追加/削除があればハッシュ部が違ったり、行の増分/減分が発生し、わかる。