ZIPファイルの整合性をテストしますか?


21

zip -Tオプションは、ファイルを抽出できるかどうかを判断するだけです。アーカイブの内部整合性を実際にテストするわけではありません。たとえば、ファイルのローカル(中央ディレクトリではなく)CRCを意図的に破損しましたが、zipはまったく気にしなくて、アーカイブをOKとして報告しました。これを行う他のユーティリティはありますか?

ZIPファイルには多くの内部冗長性があり、すべてをチェックする方法があると便利です。もちろん、通常は中央のディレクトリで十分ですが、破損したアーカイブを修復する場合、中央のディレクトリが壊れているか、欠落しているフラグメントだけが残っていることがよくあります。作成したアーカイブが可能な限り回復可能かどうかを知りたい。


2
どうunzip -t
FloHimself

zipと同じ動作。
マークロッキンド

回答:


20

unzip -t

アーカイブファイルをテストします。

このオプションは、メモリ内の指定された各ファイルを抽出し、展開されたファイルのCRC(巡回冗長検査、拡張チェックサム)を元の保存されたCRC値と比較します。

[ソース:https : //linux.die.net/man/1/unzip ]


ファイルごとにローカルとセントラルの2つのCRCがあります。unzip -t後者のみをテストします。
マークロッキンド

2
「ローカル」と「セントラル」の意味がわかりませんが(「何にセントラル?」)、「unzip -t myzip_file.zip」を実行すると、各zipファイルの整合性についてコメントするための行出力が表示されます、(より良いフォーマットを想像してください):「テスト:AARiseTransitSet.cpp OKテスト:AARiseTransitSet.h OKテスト:AASaturn.cpp OKテスト:AASaturn.h OK ...-
Theophrastus

ZIPファイルの内部構造を説明する場所ではありません。これについては、Wikepediaの記事がかなり良いです。私が言ったように、それはあなたが見ている誤解を招く報告書です。
マークロッキンド

16進エディタでzipファイルに移動して1バイトを変更すると、1つのファイルが表示されます。テスト:AA_sphere.htm bad CRC 7952862e(44c6f7f8である必要があります)が残りは「OK」としてリストされています。あなたはこれを「誤解を招く」と宣言し続けますが、それはまさにzipファイルのファイルごとのCRCチェックに期待するものです。今...あなたに幸運を。
テオプラスタス

最後に、中央ディレクトリのCRCを変更したと思います。ファイルの前または後にローカルファイルを変更してみてください。
マークロッキンド

12

アーカイブを修正しようとすると、ローカルCRCと中央CRCが比較され、それをアーカイブテストと組み合わせることで、すべてのCRCをチェックできます。走ったら

unzip -t archive.zip

そして

zip -F archive.zip --out archivefix.zip

どちらも文句を言うことはありません。つまり、アーカイブの内容は中央CRCとローカルCRCの両方に一致します。(archivefix.zip後で削除できます。)

これを確認するため、zip3.0のInfo-ZIPソースコードから始めて、次のようにファイルを作成しました。

zip -9 test.zip zip.txt zipup.c

次にzip.txt、オフセット0xB137のバイトを変更して、中央ディレクトリのCRCを破損しました。私はあなたが観察したものと反対の行動を得ました。unzip -v中央ディレクトリから変更されたCRC unzip -tzip -T報告しましたが、ファイルは問題ないことを報告しました(ローカルCRCをチェック)。

しかし、実行中

zip -F test --out testfix

報告

Fix archive (-F) - assume mostly intact archive
Zip entry offsets do not need adjusting
 copying: zip.txt
        zip warning: Local Entry CRC does not match CD: zip.txt
 copying: zipup.c

「修正済み」ファイルには、まだ変更されたCRCがリストされていますzip.txt

zip.txtオフセット0x10でローカルCRCを変更するunzip -tzip -T、両方が発生し、CRCエラーが報告されましたが、zip -F何も問題は見つかりませんでした。

したがって、私の実験から、アーカイブエントリのコンテンツとそのCRCの不一致は次のように検出できます。

  • ローカルのみ:zip -Tunzip -t; zip -Fまた、ローカルとセントラルの不一致について文句を言うでしょう
  • ローカルおよびセントラル:zip -Tおよびunzip -t
  • 中央のみ:zip -Tunzip -t文句を言うことはありませんが、zip -Fローカル・中央のミスマッチを示します

(注デフォルトではということでzip -T、単純に使用していますunzip -tqqので、zip -Tunzip -t本当に等価であるあなたが読むことができます。unzipアーカイブをテストすることは、本当に地元のCRCではなく、中央の1と比較することを確認するためにソースコードを、見ためのextract_or_test_files()extract_or_test_entrylist()およびextract_or_test_member()、全部でextract.c。)


複雑です。そして間違いなく、どのバージョン(GNU、BSDなど)にも大きく依存しています。また、CRCは、実行可能な多数の整合性チェックの1つにすぎません。
マークロッキンド

1
Unixライクなプラットフォームには多くのバージョンがなくzipunzip利用可能です。情報-ZIPは...ほとんどどこでも使用されている
スティーブン・キット

1
複雑である限り、必要なコマンドは2つだけです。両方ともエラーなしunzip -tzip -F実行される場合、問題はなく、両方のCRCがチェックされています。
スティーブンキット

ありがとう!これを確認します。また、言及するのを忘れました:ZIPファイルはZIP64です。
マークロッキンド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.