Wie kann ich die unkomprimierte Größe einer gzip-Datei ermitteln, ohne sie zu dekomprimieren?

25

Finden Sie bitte meine OS-Details:

$ uname -a
AIX xxyy 1 6 000145364C00

Ich habe den folgenden Befehl ausprobiert, um die Größe einer Datei im gzip-Archiv abzurufen:

$ gzip -l mycontent.DAT.Gz
compressed  uncompr.   ratio   uncompressed_name
-1223644243 1751372002 -75.3%  mycontent.DAT.Gz

Ich bin mir nicht sicher, wie ich die entpackte Größe daraus interpretieren soll. Komprimierte Dateigröße nahe 4 GB.

Also habe ich diese Option ausprobiert, um korrekte Daten zu erfassen:

$ zcat mycontent.DAT.Gz | wc -c

Es gibt mir diesen Fehler:

mycontent.DAT.Gz.Z:A file or directory in the path name does not exist.
0

Können Sie mir bitte sagen, wie ich diesen Wert aus dem Shell-Skript erfassen kann, ohne die Quelldatei zu dekomprimieren?

user238010
quelle
Sind Sie sich über die Integrität des Archivs sicher? Es gibt seine eigene komprimierte Größe als ~ 1.7G an. Wenn es wirklich ~ 4GB ist, würde ich vermuten, dass es ein Problem gibt.
Terdon

Antworten:

26

So beantworten Sie den Fragentitel:

Wie kann ich die unkomprimierte Größe einer gzip-Datei ermitteln, ohne sie zu dekomprimieren?

Wie Sie offensichtlich wissen, zeigt die Option -l( --list) normalerweise die unkomprimierte Größe an.
Was angezeigt wird, wird nicht aus den Daten berechnet, sondern wurde im Header als Teil der komprimierten Datei gespeichert.

In Ihrem Fall -lfunktioniert die Option aus irgendeinem Grund nicht.
Es ist jedoch nicht möglich, die unkomprimierte Größe anhand der komprimierten Rohdaten zu "messen". Die komprimierten Daten enthalten lediglich keine weiteren Informationen. Dies ist nicht verwunderlich, da bei der Komprimierung alles weggelassen werden muss, was nicht benötigt wird.

Sie müssen die nicht komprimierten Daten nicht auf der Festplatte speichern: zcat file.gz | wc -cist der richtige Ansatz - aber wie @OleTange antwortete, zcatscheint es nicht der zu sein, von dem Sie stammen gzip.
Die Alternative ist die Verwendung der gzipOptionen -d( --decompress) und -c( --to-stdout) in Kombination mit wcOption -c( --bytes):

gzip -dc file.gz | wc -c
Volker Siegel
quelle
13
Die -lOption hat einen Fehler für Dateien, die größer als 4 GB sind: bugs.debian.org/cgi-bin/bugreport.cgi?bug=149775
Flimm
6

Ihr zcatseid nicht GNU zcat sondern von compress. Versuchen:

gzcat mycontent.DAT.Gz | wc -c
gzip -dc mycontent.DAT.Gz | wc -c
Ole Tange
quelle
Dadurch wird die Quelldatei dekomprimiert. Vielleicht ist es das, was das OP will, aber dies ist nicht die Antwort auf die Frage.
Marco
Ah, das erklärt, warum nach einer Datei gesucht wurde, die mit .Z
Hennes
0

gzip -l hat bei mir nicht funktioniert, nur git-1 ... aber das hat:

unzip -l file.zip
gröber
quelle
0

Ich finde alle Websites im Web und löse dieses Problem nicht, wenn die Dateigröße 4 GB überschreitet.

Meine Lösung lautet :

[oracle @ base tmp] $ timeout --signal = SIGINT 1s tar -tvf oracle.20180303.030001.dmp.tar.gz
    -rw-r - r-- oracle / oinstall 111828 2018-03-03 03:05 oracle.20180303.030001.log
    -rw-r ----- oracle / oinstall 6666911744 2018-03-03 03:05 oracle.20180303.030001.dmp

Um die Gesamtgröße aus der gz-Datei zu erhalten:

[oracle @ base tmp] $ echo $ (Zeitlimit - signal = SIGINT 1s tar -tvf oracle.20180303.030001.dmp.tar.gz | awk '{print $ 3}') | grep -o '[[: digit:]] *' | awk '{sum + = $ 1} END {Summe drucken}'
    6667023572
RaZieRSarE
quelle
1
Dies wäre eine bessere Antwort, wenn Sie erklären würden, dass es nur für Tarballs funktioniert und Sie es bereinigt haben (Timeout ist nicht erforderlich und grep auch nicht).
kbolino