如何检查压缩文件是否为空?


10

有没有一种快速的方法来检查压缩文件是否为空,还是必须先将其解压缩?

例:

$ touch foo
$ if [ -s foo ]; then echo not empty; fi
$ gzip foo
$ if [ -s foo.gz ]; then echo not empty; fi
not empty
$ wc -l foo.gz
      1 foo.gz

Answers:


8

gzip -l foo.gz | awk 'NR==2 {print $2}' 打印未压缩数据的大小。

if LC_ALL=C gzip -l foo.gz | awk 'NR==2 {exit($2!=0)}'; then
  echo foo is empty
else
  echo foo is not empty
fi

或者,您可以开始解压缩数据。

if [ -n "$(gunzip <foo.gz | head -c 1 | tr '\0\n' __)" ]; then
    echo "foo is not empty"
else
    echo "foo is empty"
fi

(如果您的系统不必head -c提取第一个字节,请head -n 1改为提取第一行。)


LC_ALL=C想确保gzip不会在数字中放入千位分隔符,以便将该字段与零进行比较吗?
camh 2011年

1
@camh:解析命令的格式化输出时,这更普遍。可能是数字格式,或者某种语言中有两个标题行,或者我只是没想到其他很多事情。对于gzip,我认为没有什么不好的事情,但是LC_ALL=C不会造成伤害。
吉尔(Gilles)“所以,别再邪恶了”,

1
如果文件中包含数据但没有换行符,则第二种选择将失败;它也不会像read在子shell中被调用一样打印行(并且$line不会传播到父级)。
克里斯·

1
@ChrisDown很好。但是,您的修复还不够(加上编写方式仅适用于bash)。如果文件以空字节开头,则外壳程序(zsh除外)将在不应该看到空字符串。通过管道tr修复该问题。
吉尔斯(Gillles)“所以-别再邪恶了”

4

如果“空”表示未压缩的文件为0字节,则可以gzip --list foo.gz用来确定未压缩的文件的大小,这将需要一些解析来使其自动化。看起来像这样:

$ gzip --list foo.gz
         compressed        uncompressed  ratio uncompressed_name
                 24                   0   0.0% foo

这本质上是答案1!
Henno Brandsma 2011年

1
在这之后发布的...。
jsbillings 2011年

2
test -z $(gzip -cd foo.gz | head -c1) && echo "empty"

或搭配if

if [ -z $(gzip -cd foo.gz | head -c1) ]; then
  echo "empty"
fi

zcat有时链接到gunzip -cgzip -cd,如果您想将其用作较短的“表格”。


0

请注意,gzip文件格式仅允许使用32位存储原始文件大小,因此该数字为模2 ^ 32。因此,“ gzip -l”给出的大小不是对空性的确定测试。


2
请提供一个有关如何解决方案的示例,以使其成为更完整的答案。
乔治M
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.