据我所知, zip -T 选项仅确定是否可以提取文件 - 它并没有真正测试存档的内部完整性。例如,我故意损坏了一个文件的本地(不是中央目录)CRC,而 zip 根本不关心,报告存档正常。还有其他实用程序可以做到这一点吗?
ZIP 文件中有很多内部冗余,如果有一种方法可以检查所有这些内容那就太好了。当然,通常情况下,您只需要中央目录,但是在修复损坏的存档时,您通常拥有的只是一个片段,其中中央目录已损坏或丢失。我想知道我创建的档案是否可以尽可能恢复。
答案1
解压-t
测试存档文件。
该选项提取内存中的每个指定文件,并将扩展文件的 CRC(循环冗余校验,增强校验和)与原始存储的 CRC 值进行比较。
答案2
使用信息ZIP,尝试修复存档将比较本地和中央 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,但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
“更正后的”文件仍然列出了更改后的 CRC zip.txt
。
zip.txt
更改偏移量 0x10 处的本地 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
、 sozip -T
和unzip -t
real 是等价的。您可以阅读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 文件时遇到问题,它可能会终止并显示无用的错误消息。