Zip -Tオプションは、ファイルを抽出できるかどうかを判断するだけのことですが、アーカイブの内部整合性を実際にテストするわけではありません。たとえば、ファイルのローカル(中央ディレクトリではなく)CRCを故意に破損しましたが、Zipはまったく気にせず、アーカイブをOKと報告しました。これを行う他のユーティリティはありますか?
Zipファイルには多くの内部冗長性があり、すべてをチェックする方法があるといいでしょう。もちろん、通常は中央ディレクトリだけで十分ですが、破損したアーカイブを修復する場合、中央ディレクトリが壊れているか欠落しているフラグメントのみが多いことがよくあります。私が作成したアーカイブが可能な限り復元可能かどうか知りたいのですが。
unzip -t
アーカイブファイルをテストします。
このオプションは、メモリ内の指定された各ファイルを抽出し、拡張ファイルのCRC(巡回冗長検査、拡張チェックサム)を元の保存されたCRC値と比較します。
アーカイブを修正しようとすると、ローカルと中央のCRCが比較され、それをアーカイブテストと組み合わせると、すべてのCRCをチェックできます。走れば
_unzip -t archive.Zip
_
および
_Zip -F archive.Zip --out archivefix.Zip
_
どちらも文句を言いません。つまり、アーカイブのコンテンツは中央とローカルの両方のCRCに一致します。 (後で_archivefix.Zip
_を削除できます。)
これを確認するために、Zip
3.0のInfo-Zipソースコードから始めて、次のようにファイルを作成しました。
_Zip -9 test.Zip zip.txt zipup.c
_
次に、オフセット0xB137のバイトを変更して、_Zip.txt
_の中央ディレクトリCRCを破損させました。私はあなたが観察したのとは逆の振る舞いをしました。 _unzip -v
_は、中央ディレクトリから変更されたCRCを報告しましたが、_unzip -t
_および_Zip -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
_
「修正済み」ファイルには、_Zip.txt
_の変更されたCRCがまだリストされています。
オフセット0x10で_Zip.txt
_のローカルCRCを変更すると、_unzip -t
_と_Zip -T
_の両方でCRCエラーが報告されましたが、_Zip -F
_は問題を発見しませんでした。
したがって、私の実験から、アーカイブエントリの内容とそのCRCの不一致は、次のように検出できます。
Zip -T
_および_unzip -t
_; _Zip -F
_は、ローカルと中央の不一致についても不平を言うZip -T
_および_unzip -t
_Zip -T
_および_unzip -t
_は文句を言わないが、_Zip -F
_はローカルと中央の不一致を示す(デフォルトでは、_Zip -T
_は単に_unzip -tqq
_を使用するため、_Zip -T
_と_unzip -t
_は実際には同等です。unzip
ソースコードを読んで、そのテストを確認できます。アーカイブは、実際には中央のCRCではなくローカルCRCを比較します。extract_or_test_files()
、extract_or_test_entrylist()
およびextract_or_test_member()
をすべて_extract.c
_で探します。)