如何创建最小尺寸(空)的zip文件,它有22B?

时间:2015-03-24 14:13:41

标签: linux windows compression zip

我正在尝试用文件解决一些安全问题,其MD5哈希是76cdb2bad9582d23c1f6f4d868218d6c。

我没有该文件,但基于互联网MD5搜索,我认为,它是最小尺寸的zip文件。 我找到了一个example,其内容与minimum size zip file完全相同。

是否可以使用Linux(或Windows)命令创建此类最小尺寸的zip文件(22 B)?

BTW:最近,我用gzip文件解决了类似的任务:gzip -n EmptyFileName

5 个答案:

答案 0 :(得分:29)

你走了:

50 4b 05 06 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00

具有您提供的MD5签名。

如果您有Info-ZIP的zip,您可以这样创建:

zip empty.zip anyfile
zip -d empty.zip anyfile

将“anyfile”添加到新的zip文件中,然后将其从zip文件中删除,并将其保留为空。

答案 1 :(得分:5)

一种易于使用的版本,用于复制和粘贴到shell中:

echo UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA== | base64 -d > empty.zip

这只打印空zip文件的base64'版本(通过创建带有单个文件的zip文件然后从zip文件中删除该单个文件创建),并使用{{1来反转编码并将输出写入base64 -d

如果你机器附带的empty.zip版本没有使用与上面相同的语法,那么这是一个更便携但更简洁的替代方案:

base64

答案 2 :(得分:1)

对于 Info-Zip(Ubuntu 20.04 上的标准 zip/unzip 安装),您必须使用 -i "*" 选项。如果它不存在,则 zip 会在创建时报错并退出,并显示错误代码 1。与直觉相反,它的行为随 -i "*" 发生变化。

mkdir /tmp/mytest
cd /tmp/mytest
zip -r mytest.zip . -i "*"

mytest.zip 将是您想要的空 zip 文件。

答案 3 :(得分:0)

使用此.bat脚本,您可以在Windows下创建empty.zip文件:

@echo off

del /q /f empty.zip >nul 2>nul
certutil -decode "%~f0" empty.zip

-----BEGIN CERTIFICATE-----
UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA==
-----END CERTIFICATE-----

答案 4 :(得分:0)

tldr;

使用printf

$ printf '\x50\x4b\x05\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >empty.zip
$ md5sum empty.zip 
76cdb2bad9582d23c1f6f4d868218d6c  empty.zip

使用base64

$ base64 -d >empty.zip <<'EOF'
UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA==
EOF
$ md5sum empty.zip
76cdb2bad9582d23c1f6f4d868218d6c  empty.zip

说明

虽然zip工具不支持创建空的zip文件,但是您可以创建一个非空的zip文件,然后删除其内容:

$ touch foo.txt
$ zip empty.zip foo.txt
  adding: foo.txt (stored 0%)
$ zip -d empty.zip foo.txt
deleting: foo.txt
    zip warning: zip file empty

请注意,当给定结果zipinfo时,empty.zip如何返回错误:

$ zipinfo empty.zip 
Archive:  empty.zip
Zip file size: 22 bytes, number of entries: 0
Empty zipfile.
$ echo $?
1

您可以确认empty.zip具有预期的字节数:

$ file empty.zip
empty.zip: Zip archive data (empty)
$ xxd empty.zip
00000000: 504b 0506 0000 0000 0000 0000 0000 0000  PK..............
00000010: 0000 0000 0000                           ......

您可以使用printf将这22个字节(以十六进制表示)直接写入文件:

$ printf '\x50\x4b\x05\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' >empty.zip

您还可以将这22个字节转换为32个base64编码的字符,并使用该字符:

$ base64 <empty.zip 
UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA==