Wie kann ich überprüfen, ob eine komprimierte Datei leer ist?

10

Gibt es eine schnelle Möglichkeit, um zu überprüfen, ob eine komprimierte Datei leer ist, oder muss ich sie zuerst entpacken?

Beispiel:

$ 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
quelle

Antworten:

8

gzip -l foo.gz | awk 'NR==2 {print $2}' druckt die Größe der unkomprimierten Daten.

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

Alternativ können Sie die Daten dekomprimieren.

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

(Wenn Ihr System nicht head -cdas erste Byte head -n 1extrahieren muss, extrahieren Sie stattdessen die erste Zeile.)

Gilles 'SO - hör auf böse zu sein'
quelle
Ich gehe davon LC_ALL=Caus, dass gzip nicht tausend Trennzeichen in Zahlen einfügt, damit das Feld mit Null verglichen werden kann.
Camh
1
@camh: Es ist allgemeinere Paranoia, wenn formatierte Ausgaben eines Befehls analysiert werden. Es könnte das Zahlenformat sein oder dass es in einer Sprache zwei Kopfzeilen gibt oder viele andere Dinge, an die ich einfach nicht gedacht habe. Im Fall von gzip denke ich, dass nichts Schlimmes passiert, aber LC_ALL=Cnicht schaden kann.
Gilles 'SO - hör auf böse zu sein'
1
Die zweite Alternative schlägt fehl, wenn die Datei Daten enthält, jedoch keinen Zeilenumbruch. Die Zeile wird auch nicht gedruckt, während readsie in einer Unterschale aufgerufen wird (und $linenicht an die übergeordnete Zeile weitergegeben wird ).
Chris Down
1
@ ChrisDown Gut entdeckt. Ihr Fix reicht jedoch nicht aus (und die Art und Weise, wie Sie ihn geschrieben haben, ist nur Bash). Wenn die Datei mit einem Null-Byte beginnt, wird in der Shell (außer zsh) eine leere Zeichenfolge angezeigt, wenn dies nicht der Fall sein sollte. Ein Rohrdurchgang trbehebt das.
Gilles 'SO - hör auf böse zu sein'
4

Wenn mit "leer" gemeint ist, dass die unkomprimierte Datei 0 Byte gzip --list foo.gzgroß ist, können Sie die Größe der unkomprimierten Datei bestimmen, um sie zu automatisieren. Es sieht ungefähr so ​​aus:

$ gzip --list foo.gz
         compressed        uncompressed  ratio uncompressed_name
                 24                   0   0.0% foo
jsbillings
quelle
Dies ist im Wesentlichen Antwort 1!
Henno Brandsma
1
... was nach diesem gepostet wurde.
jsbillings
2
test -z $(gzip -cd foo.gz | head -c1) && echo "empty"

Oder mit if:

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

zcatwird manchmal mit gunzip -coder verknüpft gzip -cd, wenn Sie es als kürzeres "Formular" verwenden möchten.

wedeln
quelle
0

Bitte beachten Sie, dass das gzip-Dateiformat nur 32 Bit zum Speichern der ursprünglichen Dateigröße zulässt, sodass die Nummer dort die Größe modulo 2 ^ 32 ist. Daher ist die durch "gzip -l" angegebene Größe kein endgültiger Test für die Leere.

Brendan
quelle
2
Bitte machen Sie dies zu einer vollständigeren Antwort, indem Sie ein Beispiel hinzufügen, wie Sie sich einer Lösung nähern würden.
George M