如何在 Bash 中检查 zip 文件是否为空

如何在 Bash 中检查 zip 文件是否为空

我如何验证 zip 文件是否为空?我无法在 bash 中使用 if -s,因为 zip 文件的大小并不总是为零。如果 zip 文件中有空目录,我想删除该文件,否则提取该文件。

答案1

如果您安装了 Info-ZIP 工具(zipunzipzipinfo),则可以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

相关内容