
私が知っている限り、zip -Tオプションはファイルを抽出できるかどうかを決定し、実際にはアーカイブの内部整合性をテストしません。たとえば、ファイルのローカル(非中央ディレクトリ)CRCを意図的に破損させ、zipはまったく気にせずにアーカイブを正常に報告しました。これを行うことができる他のユーティリティはありますか?
ZIPファイルには内部冗長性が多いのですが、すべて確認できる方法があれば良いようです。もちろん、通常は中央ディレクトリのみが必要ですが、破損したアーカイブを修復するときに通常持っているのは、中央ディレクトリが破損または欠落している部分だけです。私が作成したアーカイブが回復可能かどうかを知りたいです。
答え1
解凍 -t
テストアーカイブファイル。
このオプションは、メモリに指定された各ファイルを抽出し、拡張ファイルの巡回冗長検査、拡張チェックサム(CRC)を元に保存されたCRC値と比較します。
答え2
使用情報郵便番号、アーカイブの回復を試みると、ローカルおよび中央CRCが比較され、それをアーカイブテストと組み合わせることで、すべてのCRCを確認できます。走れば
unzip -t archive.zip
そして
zip -F archive.zip --out archivefix.zip
両側とも不満はありませんでした。これは、書類の内容が中央および地域のCRCと一致したことを意味します。 (archivefix.zip
今後削除される可能性があります。)
これを確認するために、3.0 Info-ZIPソースコードからzip
次のようにファイルを生成しました。
zip -9 test.zip zip.txt zipup.c
zip.txt
その後、オフセット0xB137でバイトを変更して中央ディレクトリCRCを破損させました。私の行動はあなたが観察したのと反対です。unzip -v
変更されたCRCは中央ディレクトリに報告されますが、ファイルはOK(ローカルCRCと比較して確認済み)としてunzip -t
報告されます。zip -T
しかし走っている
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を変更すると、CRCエラーが発生して報告されunzip -t
ましたが、エラーは見つかりませんでした。zip -T
zip -F
したがって、私の実験では、アーカイブエントリの内容と対応するCRCの間の不一致は、次のように検出できます。
- ローカルのみ:
zip -T
とunzip -t
;zip -F
また、ローカルと中央の不一致について文句を言います。 - 地域と中央:
zip -T
とunzip -t
- 中央のみ:文句を
zip -T
言わないが、ローカルが中央と一致しないとマークされます。unzip -t
zip -F
(デフォルトではzip -T
sounzip -tqq
とzip -T
realのみがunzip -t
同じです。unzip
ソースコードを読んで、テストアーカイブが実際に中央CRCではなくローカルCRCを比較しているかどうかをextract_or_test_files()
確認extract_or_test_entrylist()
できextract_or_test_member()
ますextract.c
。
答え3
あなたは一度見たいと思うかもしれませんzipdetails
。マニュアルページから:
Zipdetails は、zip ファイルの内部レコード構造に関する情報を表示します。 zipファイルに保存されている圧縮データの詳細を表示することとは関係ありません。
zipdetails
不一致が検出されるかどうかはわかりませんが、不一致を見つけて理解するのに役立ちます。以下は出力の小さなサンプルです。
00000 LOCAL HEADER #1 04034B50
00004 Extract Zip Spec 14 '2.0'
00005 Extract OS 00 'MS-DOS'
00006 General Purpose Flag 0808
[Bits 1-2] 0 'Normal Compression'
[Bit 3] 1 'Streamed'
[Bit 11] 1 'Language Encoding'
00008 Compression Method 0008 'Deflated'
0000A Last Mod Time 5352884C 'Mon Oct 18 17:02:24 2021'
0000E CRC 00000000
00012 Compressed Length 00000000
00016 Uncompressed Length 00000000
0001A Filename Length 000B
0001C Extra Length 0000
0001E Filename 'graphic.svg'
00029 PAYLOAD
02947 STREAMING DATA HEADER 08074B50
0294B CRC C622C669
0294F Compressed Length 0000291E
02953 Uncompressed Length 0002F706
マンページでもこれを確認できます。
エラー処理はまだ進行中です。プログラムがzipファイルを読み取る際に問題が発生した場合は、役に立たないエラーメッセージで終了する可能性があります。