製品選び
📝

バックアップZIPの復元確認:ファイル数が同じでも内容の違いを見つける

合成ファイル8個を実際に圧縮・復元し、意図的な欠落と同サイズの内容変更を検出しました。相対パス、バイト数、SHA256を照合する手順、24行の結果CSV、再現用スクリプトの使い方と、この小規模試験では確認していない限界を説明します。

バックアップZIPの復元確認:ファイル数が同じでも内容の違いを見つける

バックアップのZIPがあり、展開が終われば、中身も元のファイルと同じでしょうか。確かめるには、復元した各ファイルの相対パス・バイト数・SHA256を元の記録と並べて比較します。SHA256は内容から計算する長い指紋のような値です。名前とサイズが同じでも、内容が変われば指紋の比較で違いを見つけられます。

この記事の目的はバックアップソフト選びではありません。原本を上書きしない小さな復元試験を行い、結果表で欠落と内容変更を見分けることです。MillionsCode編集部は合成ファイル8個を作り、実際に圧縮・復元しました。その後、2種類の不具合を意図的に入れ、比較処理が検出するか確認しました。実際の顧客資料や個人バックアップは使っていません。

8ファイルの実測と検証方法

2026年9月28日、Windows上でPowerShell 7.6.0-rc.1とMicrosoft.PowerShell.Archive 1.2.5を使用しました。複数の安定版の互換性を比べた試験ではありません。0バイトのファイル、空白を含む韓国語のファイル名、各4バイトで内容の違う2ファイル、別の下位フォルダーにある同名ファイル、256バイトのバイナリ、説明文を含めました。合計8個、372バイトです。

まず原本一覧を作り、nested/level2/sample.txtのような試験フォルダーからの位置を相対パスとして記録しました。サイズとSHA256を保存し、フォルダーをZIPにして新しい場所に展開しました。同じ相対パス同士でサイズと指紋を比べます。ファイル名だけでは、別フォルダーにある2個のsample.txtを混同する恐れがあります。

試験条件原本数比較対象数一致検出した違い
ZIPを新しいフォルダーに正常復元888なし
復元物を再コピーするとき1個を意図的に除外877入れ子フォルダーの15バイトファイルが欠落
別の復元コピーでAAAAをZZZZに変更8874バイトファイルのSHA256不一致

最初は正常経路です。後の2つは、故障を入れたら失敗表示になるか調べる対照試験です。ZIPツールが紛失や破損を起こした結果ではありません。欠落はコピー段階に、内容変更は展開後の別コピーに編集部が加えました。

特に3番目では、ファイル数は双方8個、変更ファイルも前後とも4バイトでした。フォルダーサイズや個数だけなら通過し得ますが、指紋照合では1ファイルの違いが見つかりました。個数とサイズは素早い確認項目であり、内容一致は別の検査です。

結果CSVの読み方

restore-summary.csvは3試験の要約です。restore-comparison.csvにはファイル単位で24行あります。Caseは試験名、RelativePathはフォルダー内の位置です。ExpectedBytesとActualBytesは原本と比較対象のサイズ、2つのSHA256列は内容の指紋です。技術的な英語列名と韓国語ファイル名は実測記録のまま残しています。

  • MATCH:同じ相対パスのサイズと内容指紋が一致しました。
  • MISSING:原本一覧のパスが比較対象にありません。実サイズの空欄は0バイトではなくファイル不在です。
  • HASH_MISMATCH:サイズは同じでも内容指紋が違いました。再復元して調べる対象です。
  • スクリプトはサイズ違いをSIZE_MISMATCH、原本一覧にないファイルをUNEXPECTEDと表示します。この2分岐には今回、個別に故障を注入していません。

例えばsame_size_changeのsame-a.txt行は両方4バイトです。しかし原本指紋は63C1DD95…、変更後は96741164…で始まります。実際の比較には先頭部分だけでなく64桁全体を使いました。empty.txtは最初から0バイトで、正常復元でも同じ指紋でした。「0バイトだから破損」と一律判断すると、意図した空ファイルまで誤検出します。

自分の資料で試す前に安全に再現する

再現用スクリプト原文を先に読み、練習フォルダーにrestore-lab.ps1として保存します。拡張子が.ps1.txtのままではないことを確認してください。このスクリプトは利用者のファイルパスを受け取りません。置いた場所の下に毎回新しい試験フォルダーを作り、自分で生成したファイルだけを圧縮・復元・変更します。原本削除コマンドや既存復元物の強制上書きオプションもありません。空の練習フォルダーに置き、内容を読んでからPowerShellで実行してください。会社の規則で実行が禁止されている場合は勝手に解除せず、下の手動手順で理解しても構いません。

# restore-lab.ps1を保存した練習フォルダーで実行
& '.\restore-lab.ps1'

実行結果はzip_restoreがPASS、意図的な故障2件がFAILになるはずです。ControlBehavedAsExpectedが3行ともTrueなら、今回の正常・故障条件では予想どおりに判定したという意味です。故障試験のFAILを正常バックアップの失敗と混同しないでください。終了後、画面に表示された新フォルダーのCSVとresults.jsonで、実行時刻、バージョン、指紋全体を確認できます。

実際のバックアップは、圧縮を作った時点の原本一覧を基準にします。その後に編集された現在のファイルと比べれば、正常な過去バックアップも不一致になります。重要ファイルのコピーで先に練習し、復元先は既存資料のない新しいフォルダーにします。原本の場所を展開先に選びません。

主なコマンドは次のとおりです。パスは説明用なので、練習フォルダー内だけで変更して使います。最初は練習原本の圧縮、2番目は新しい場所への復元、最後の2つは対応するファイルの指紋表示です。復元先にsourceが1段増えるのは、フォルダー自体を圧縮したためです。

Compress-Archive -LiteralPath '.\source' -DestinationPath '.\trial.zip'
Expand-Archive -LiteralPath '.\trial.zip' -DestinationPath '.\restore-new'
Get-FileHash -LiteralPath '.\source\notes.txt' -Algorithm SHA256
Get-FileHash -LiteralPath '.\restore-new\source\notes.txt' -Algorithm SHA256

MicrosoftのGet-FileHash説明で内容指紋と既定のSHA256を確認できます。Expand-Archive説明は展開先指定と上書きオプションを区別しています。この例では-Forceで既存ファイルを上書きしません。

通過しても未確認のこと

Q. 通過すればバックアップ全体も安全ですか?

今回のPASSは合成8ファイルの位置・サイズ・内容が復元後に一致したという意味です。SSD速度、ディスク寿命、クラウド同期成功率、大容量バックアップの信頼性は測っていません。1環境のみで、権限、所有者、暗号鍵、アプリ設定、開いたデータベースも試験していません。表計算や写真がアプリで開けるか、業務ソフトの関連資料が戻るかは別途確認します。

Q. 隠しファイルや大容量ファイルも対象ですか?

MicrosoftのCompress-Archive文書は、隠しファイル・フォルダーを飛ばす場合とファイルサイズ制限を説明しています。この小さなZIP例を、OS全体や隠し設定を保存する方法に広げないでください。今回の原本に隠しファイルと2GB以上のファイルは含めていません。

Q. 原本と指紋が合えば検証は終わりですか?

基準一覧自体が誤っていたり一緒に改ざんされたりすると、指紋一致だけでは本物の原本だと保証できません。別に保管した一覧と作成時点を確認し、欠落や不一致があれば原本を消す前に該当パスを再復元します。一覧と指紋の確認後に、実際に必要な文書を開くところまで行えば、ZIPの存在確認だけより次の復旧行動を具体的に決められます。

関連