2010-04-26 7 views

Répondre

23

Cela somme la taille du contenu total des fichiers extraits:

$ tar tzvf archive.tar.gz | sed 's/ \+/ /g' | cut -f3 -d' ' | sed '2,$s/^/+ /' | paste -sd' ' | bc 

La sortie est donnée en octets.

Explication: tar tzvf répertorie les fichiers dans l'archive au format verbeux comme ls -l. sed et cut isolent le champ de taille de fichier. Le second sed place un + devant chaque taille sauf la première et paste les concatène, donnant une expression de somme qui est ensuite évaluée par bc. Notez que cela n'inclut pas les métadonnées, donc l'espace disque occupé par les fichiers lorsque vous les extrayez sera plus grand - potentiellement beaucoup plus grand si vous avez beaucoup de très petits fichiers.

+14

Ou un peu plus concis: 'tar tzvf archive.tar.gz | awk '{s + = $ 3} FIN {print (s/1024/1024), MB}' '. – Rubens

43

Si vous voulez faire de la ligne de commande, vous pouvez essayer l'option -l à gzip:

$ gzip -l compressed.tar.gz 
    compressed  uncompressed ratio uncompressed_name 
      132    10240 99.1% compressed.tar 
+2

Cela me donne la taille du fichier tar y compris les méta-données de fichiers tels que les noms de fichiers, etc. Je cherchais un moyen de vérifier uniquement la taille totale des fichiers.Quoi qu'il en soit, la seule façon de le faire semble être d'extraire le fichier tar et d'exécuter un script sur le contenu extrait. – Ztyx

+1

En fait, cela pourrait être suffisant. Vous aurez également besoin d'espace pour les inodes de dossier, qui peuvent varier pour différents systèmes de fichiers. De plus, 'tar -tf ...' avec une taille réelle de comptage ** lancera gzip -d ** sur le fichier complet, donc vous extrayez réellement tar. ** gzip -l ** indiqué ici ne sera pas extrait, donc c'est assez rapide. –

+0

Dans mon cas, cela me donne une taille de décompression qui est inférieure à la compression et un ratio négatif. – lefterav

-1

Un fichier tar est non compressé jusqu'à ce que/à moins qu'il ne soit filtré à travers un autre programme, comme gzip, bzip2, lzip, compress, lzma, etc. La taille du fichier tar est la même que celle des fichiers extraits, avec probablement moins de 1 Ko d'informations d'en-tête ajoutées pour en faire une archive tar valide.

+3

Il y a un en-tête de 512 octets pour chaque fichier à l'intérieur de l'archive, plus les fichiers internes sont complétés pour être un multiple de 512 octets. Cela équivaut à un surcoût moyen de 768 octets par fichier à l'intérieur de l'archive. –

19

La commande gzip -l archive.tar.gz ne fonctionne pas correctement avec des tailles de fichier supérieures à 2 Go. Je recommanderais zcat archive.tar.gz | wc --bytes à la place pour les fichiers vraiment volumineux.

+1

Je crois que 'gzip -l' ne fonctionne pas avec une taille de fichier supérieure à ** 4 Go **, car gzip n'utilise que 4 octets pour stocker la taille du fichier d'origine. – kevin

+0

En regardant la source de gzip.c, il semble que ce soit un off_t qui est une valeur de 4 octets signée, donc 2GB maximum. – swdev

+5

La spécification gzip (https://www.ietf.org/rfc/rfc1952.txt) indique que le champ ISIZE doit être la taille du fichier d'origine modulo 2^32, je ne sais pas pourquoi gzip utilise un int signé ... – kevin

4

Utilisez la commande suivante:

tar -xzf archive.tar.gz --to-stdout|wc -c 
1

Je sais que c'est une vieille réponse; mais j'ai écrit un outil juste pour cela il y a deux ans. Il est appelé gzsize et il vous donne la taille non compressée d'un fichier gzippé sans décompresser réellement le fichier entier sur le disque:

$ gzsize <your file> 
0

Je trouve des sites tout dans le web, et ne résolvent pas ce problème, la obtenir la taille lorsque la taille du fichier est supérieure à 4 Go.

d'abord, ce qui est le plus rapide?

 
[[email protected] tmp]$ time zcat oracle.20180303.030001.dmp.tar.gz | wc -c 
    6667028480 

    real 0m45.761s 
    user 0m43.203s 
    sys  0m5.185s 
 
[[email protected] tmp]$ time gzip -dc oracle.20180303.030001.dmp.tar.gz | wc -c 
    6667028480 

    real 0m45.335s 
    user 0m42.781s 
    sys  0m5.153s 
 
[[email protected] tmp]$ time 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 

    real 0m46.669s 
    user 0m44.347s 
    sys  0m4.981s 

certainement, tar -xvf est le plus rapide, mais ¿comment annuler les exécutions après obtiennent en-tête?

ma solution est ce:

 

[[email protected] tmp]$ time 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 

    real 0m1.005s 
    user 0m0.013s 
    sys  0m0.066s 

Questions connexes