Come posso verificare se un file gzipped è vuoto?


10

Esiste un modo rapido per verificare se un file compresso con zip è vuoto o devo prima decomprimerlo?

esempio:

$ 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

Risposte:


8

gzip -l foo.gz | awk 'NR==2 {print $2}' stampa la dimensione dei dati non compressi.

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

In alternativa puoi iniziare a decomprimere i dati.

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

(Se il tuo sistema non deve head -cestrarre il primo byte, usa invece head -n 1per estrarre la prima riga.)


Presumo che LC_ALL=Cci sia per garantire che gzip non inserisca migliaia di separatori in numeri in modo che il campo possa essere confrontato con zero?
Camh

1
@camh: è la paranoia più generale quando analizza l'output formattato da un comando. Potrebbe essere il formato numerico o che in alcune lingue ci sono due righe di intestazione o molte altre cose a cui non ho pensato. Nel caso di gzip, penso che non accada nulla di brutto, ma LC_ALL=Cnon posso far male.
Gilles 'SO- smetti di essere malvagio' il

1
La seconda alternativa fallirà se il file contiene dati ma non ha una nuova riga; inoltre non stampa la riga come readviene invocata in una subshell (e $linenon viene propagata al genitore).
Chris Down

1
@ChrisDown Ben individuato. Tuttavia, la tua correzione non è abbastanza (inoltre il modo in cui l'hai scritta è solo bash). Se il file inizia con un byte null, la shell (diversa da zsh) vedrà una stringa vuota quando non dovrebbe. Un tubo attraverso lo trrisolve.
Gilles 'SO- smetti di essere malvagio' l'

4

Se per "vuoto" si intende che il file non compresso è pari a 0 byte, è possibile utilizzare gzip --list foo.gzper determinare la dimensione del file non compresso, per automatizzarlo richiederebbe qualche analisi. Sembra qualcosa del genere:

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

Questa è essenzialmente la risposta 1!
Henno Brandsma,

1
... che è stato pubblicato dopo questo.
jsbillings,

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

O con if:

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

zcata volte è collegato gunzip -co gzip -cd, se si desidera utilizzarlo come "modulo" più breve.


0

Si noti che il formato del file gzip consente solo 32 bit per la memorizzazione della dimensione del file originale, quindi il numero è la dimensione modulo 2 ^ 32. Quindi la dimensione data da "gzip -l" non è un test definitivo per il vuoto.


2
Si prega di rendere questa una risposta più completa includendo un esempio di come affrontare una soluzione.
George M,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.