Comment puis-je obtenir la taille non compressée du fichier gzip sans le décompresser réellement?

25

Veuillez trouver les détails de mon système d'exploitation:

$ uname -a
AIX xxyy 1 6 000145364C00

J'ai essayé la commande suivante pour obtenir la taille d'un fichier dans l'archive gzip:

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

Je ne sais pas comment interpréter la taille décompressée à partir de cela. Taille du fichier compressé proche de 4 Go.

J'ai donc essayé cette option afin de capturer des données correctes:

$ zcat mycontent.DAT.Gz | wc -c

Cela me donne cette erreur:

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

Pouvez-vous me dire comment capturer cette valeur à partir d'un script shell sans décompresser le fichier source?

user238010
la source
Êtes-vous sûr de l'intégrité de l'archive? Il rapporte sa propre taille compressée à ~ 1,7G. Si c'est vraiment ~ 4 Go, je suppose qu'il y a un problème.
terdon

Réponses:

26

Pour répondre au titre de la question:

Comment puis-je obtenir la taille non compressée du fichier gzip sans le décompresser réellement?

Comme vous le savez évidemment, l'option -l( --list) affiche généralement la taille non compressée.
Ce qu'il montre n'est pas calculé à partir des données, mais a été stocké dans l'en-tête dans le cadre du fichier compressé.

Dans votre cas, l' -loption ne fonctionne pas pour une raison quelconque.
Mais il n'est pas possible de `` mesurer '' la taille non compressée à partir des données compressées brutes - il n'y a tout simplement aucune information sur quoi que ce soit d'autre dans les données compressées - ce qui n'est pas surprenant, car le point de compression est de laisser de côté tout ce qui n'est pas nécessaire.

Vous n'avez pas besoin de stocker les données non compressées sur le disque: zcat file.gz | wc -cc'est la bonne approche - mais comme @OleTange a répondu, votre zcatsemble ne pas être celui de gzip.
L'alternative utilise les gzipoptions -d( --decompress) et -c( --to-stdout), combinées avec l' wcoption -c( --bytes):

gzip -dc file.gz | wc -c
Volker Siegel
la source
13
L' -loption comporte un bogue pour les fichiers supérieurs à 4 Go: bugs.debian.org/cgi-bin/bugreport.cgi?bug=149775
Flimm
6

Vous zcatn'êtes pas GNU zcat mais de compress. Essayer:

gzcat mycontent.DAT.Gz | wc -c
gzip -dc mycontent.DAT.Gz | wc -c
Ole Tange
la source
Cela décompresse le fichier source. C'est peut-être ce que veut le PO, mais ce n'est pas la réponse à la question.
Marco
Ah, cela explique pourquoi il recherchait un fichier se terminant par .Z
Hennes
0

gzip -l n'a pas fonctionné pour moi, juste git -1 ... mais cela a fonctionné:

unzip -l file.zip
plus grossier
la source
0

Je trouve tous les sites sur le Web et ne résout pas ce problème lorsque la taille du fichier est supérieure à 4 Go.

ma solution est la suivante :

[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

pour obtenir la taille totale du fichier gz:

[oracle @ base tmp] $ echo $ (timeout --signal = SIGINT 1s tar -tvf oracle.20180303.030001.dmp.tar.gz | awk '{print $ 3}') | grep -o '[[: digit:]] *' | awk '{sum + = $ 1} END {print sum}'
    6667023572
RaZieRSarE
la source
1
Ce serait une meilleure réponse si vous expliquiez que cela ne fonctionne que pour les tarballs et que vous la nettoyiez (le délai d'attente n'est pas nécessaire, et grep non plus).
kbolino