gzip圧縮されたファイルが空かどうかを確認するにはどうすればよいですか?


10

gzipで圧縮されたファイルが空かどうかを確認する簡単な方法はありますか、それとも最初に解凍する必要がありますか?

例:

$ 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

回答:


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

1
@camh:コマンドからのフォーマットされた出力を解析するときは、より一般的なパラノイアです。数値形式の場合もあれば、一部の言語では2行のヘッダー行がある場合や、他に考えていないことも多くあります。gzipの場合、問題はないと思いますが、LC_ALL=C害はありません。
Gilles 'SO-悪をやめなさい'

1
ファイルにデータはあるが改行がない場合、2番目の方法は失敗します。またread、サブシェルで呼び出されているため、行は出力され$lineません(親には反映されません)。
Chris Down、

1
@ChrisDownよく見つけた。ただし、修正は十分ではありません(さらに、あなたが書いた方法はbashのみです)。ファイルがnullバイトで始まる場合、(zsh以外の)シェルは、そうでないはずの空の文字列を表示します。それをtr修正するパイプ。
ジル 'SO-邪悪なことをやめよ'

4

「空」とは、非圧縮ファイルが0バイトであることを意味する場合、非圧縮ファイルgzip --list foo.gzのサイズを決定するために使用できます。自動化するには解析が必要です。次のようになります。

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

これは本質的に答え1です。
Henno Brandsma

1
これの後に掲載された・・・。
jsbillings

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 -cまたはgzip -cdにリンクされることがあります。


0

gzipファイル形式では、元のファイルサイズを保存するために32ビットしか許可されないことに注意してください。したがって、そこにある数は2 ^ 32を法とするサイズです。したがって、「gzip -l」で指定されたサイズは、空かどうかの決定的なテストではありません。


2
ソリューションへの取り組み方の例を含めて、これをより完全な答えにしてください。
ジョージM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.