我如何验证 zip 文件是否为空?我无法在 bash 中使用 if -s,因为 zip 文件的大小并不总是为零。如果 zip 文件中有空目录,我想删除该文件,否则提取该文件。
答案1
如果您安装了 Info-ZIP 工具(zip
、unzip
、zipinfo
),则可以zipinfo
在 zip 文件上使用,然后将输出发送到/dev/null
。如果文件不为空,则状态将为 0。
所以:
if zipinfo foo.zip > /dev/null; then
echo not empty
else
echo empty
fi
答案2
如果 zip 文件中没有任何内容,则在运行zipinfo -t foo.zip
退出状态(来自$?
)时会出现错误。在我运行的版本(3.00)中会出现这种情况,1
但我想这只是一个一般的错误代码,因此歧义可能会导致其他问题。
您还必须处理命令的文本输出,该输出是包含文件基本信息的字符串。我相信这个答案与上面的答案类似。
编辑:如果您想避免模棱两可的返回值(并且您有兴趣grep
),您可以 grep 上述命令的输出以查找“Empty zipfile”。
答案3
如果您已经jar
安装,则可以使用以下-t
选项:
jar -tvf file.zip
所有 Directores 都会有尾部斜杠,因此您可以将其传输到grep
:
if jar -tvf file.zip | egrep -v '/$' > /dev/null; then # we have some files!
unzip file.zip
else
rm -f file.zip
fi
答案4
可以通过内容检测空 zip 文件。要检查这一点,您可以通过哈希或内容相等性进行比较。
# Check by byte-content
$ diff <(echo -ne '\x50\x4b\x05\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') mytest.zip
# Check by hash
$ md5sum -c <<<"76cdb2bad9582d23c1f6f4d868218d6c mytest.zip"
mytest.zip: OK
与直觉相反,您可以使用 zip 选项创建一个空的 zip 文件仅用于测试-i "*"
。如果不存在,zip 会在创建时发出抱怨并退出,错误代码为 1。
$ mkdir /tmp/mytest
$ cd /tmp/mytest
$ zip -r mytest.zip . -i "*"
这使您可以检查所需的属性:
$ md5sum mytest.zip
76cdb2bad9582d23c1f6f4d868218d6c mytest.zip
$ sha512sum mytest.zip
5e2f959f36b66df0580a94f384c5fc1ceeec4b2a3925f062d7b68f21758b86581ac2adcfdde73a171a28496e758ef1b23ca4951c05455cdae9357cc3b5a5825f mytest.zip
$ base64 mytest.zip
UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA==
$ hexdump -C mytest.zip
00000000 50 4b 05 06 00 00 00 00 00 00 00 00 00 00 00 00 |PK..............|
00000010 00 00 00 00 00 00 |......|
00000016