Bagaimana saya bisa mengecek apakah file gzip kosong?

10

Apakah ada cara cepat untuk memeriksa apakah file gzip kosong, atau haruskah saya unzip dulu?

contoh:

$ 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
dogbane
sumber

Jawaban:

8

gzip -l foo.gz | awk 'NR==2 {print $2}' mencetak ukuran data yang tidak terkompresi.

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

Atau Anda dapat mulai membuka kompres data.

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

(Jika sistem Anda tidak perlu head -cmengekstrak byte pertama, gunakan head -n 1untuk mengekstrak baris pertama.)

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya berasumsi LC_ALL=Capakah ada untuk memastikan bahwa gzip tidak memasukkan ribuan pemisah dalam jumlah sehingga bidang dapat dibandingkan dengan nol?
camh
1
@camh: Ini paranoia yang lebih umum ketika parsing output yang diformat dari sebuah perintah. Ini bisa berupa format angka, atau dalam beberapa bahasa ada dua baris tajuk, atau banyak hal lain yang belum saya pikirkan. Dalam kasus gzip, saya pikir tidak ada hal buruk yang terjadi, tetapi LC_ALL=Ctidak ada salahnya.
Gilles 'SANGAT berhenti menjadi jahat'
1
Alternatif kedua akan gagal jika file memiliki data tetapi tidak memiliki baris baru; itu juga tidak akan mencetak baris seperti readyang dipanggil dalam subkulit (dan $linetidak diperbanyak ke induknya).
Chris Down
1
@ ChrisDown Terlihat dengan baik. Perbaikan Anda tidak cukup (ditambah cara Anda menulisnya hanya untuk bash). Jika file dimulai dengan byte nol, shell (selain zsh) akan melihat string kosong ketika seharusnya tidak. Sebuah pipa melalui trperbaikan itu.
Gilles 'SO- stop being evil'
4

Jika dengan 'kosong' Anda berarti bahwa file yang tidak dikompresi adalah 0 byte, Anda dapat menggunakan gzip --list foo.gzuntuk menentukan ukuran file yang tidak terkompresi, itu akan memerlukan beberapa penguraian untuk mengotomatiskannya. Itu terlihat seperti ini:

$ gzip --list foo.gz
         compressed        uncompressed  ratio uncompressed_name
                 24                   0   0.0% foo
jsbillings
sumber
Ini pada dasarnya adalah jawaban 1!
Henno Brandsma
1
... yang diposting setelah ini.
jsbillings
2
test -z $(gzip -cd foo.gz | head -c1) && echo "empty"

Atau dengan if:

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

zcatkadang-kadang ditautkan ke gunzip -catau gzip -cd, jika Anda ingin menggunakannya sebagai "formulir" yang lebih pendek.

mengibaskan
sumber
0

Harap dicatat bahwa format file gzip hanya memungkinkan 32 bit untuk menyimpan ukuran file asli, jadi nomor ada ukuran modulo 2 ^ 32. Oleh karena itu ukuran yang diberikan oleh "gzip -l" bukanlah tes definitif untuk kekosongan.

Brendan
sumber
2
Tolong jadikan ini jawaban yang lebih lengkap dengan memasukkan contoh bagaimana Anda akan mendekati suatu solusi.
George M