web-dev-qa-db-ja.com

大きなGZIPPEDファイルの非圧縮サイズを処理する最速の方法

ファイルがgzipされた後、特に非圧縮ファイルのサイズが4 GBを超える場合に、非圧縮ファイルのサイズを(解凍せずに)何とか照会する方法はありますか?.

RFC https://tools.ietf.org/html/rfc1952#page-5 によると、ファイルの最後の4バイトをクエリできますが、非圧縮ファイルが4GBを超える場合、値はuncompressed value modulo 2^32を表すだけです

この値はgunzip -l foo.gzを実行して取得することもできますが、おそらく上記のようにフッターを読み取っているので、「非圧縮」列にはuncompressed value modulo 2^32が再び含まれています。

最初に解凍せずに非圧縮のファイルサイズを取得する方法があるかどうか疑問に思っていました。これは、gzip圧縮されたファイルに50 GB以上のデータが含まれていて、gzcat foo.gz | wc -c


EDIT:4GBの制限は、OSXに含まれているmanユーティリティのgzipページで公開されています(Apple gzip 242

  BUGS
    According to RFC 1952, the recorded file size is stored in a 32-bit
    integer, therefore, it can not represent files larger than 4GB. This
    limitation also applies to -l option of gzip utility.
24
djhworld

最速の方法はgzipを変更して、詳細モードでテストすると解凍されたバイト数が出力されるようにすることです。私のシステムでは、7761108684バイトのファイルで、

% time gzip -tv test.gz
test.gz:     OK (7761108684 bytes)
gzip -tv test.gz  44.19s user 0.79s system 100% cpu 44.919 total

% time zcat test.gz| wc -c
7761108684
zcat test.gz  45.51s user 1.54s system 100% cpu 46.987 total
wc -c  0.09s user 1.46s system 3% cpu 46.987 total

Gzip(Debianで入手可能な1.6)を変更するためのパッチは次のとおりです。

--- a/gzip.c
+++ b/gzip.c
@@ -61,6 +61,7 @@
 #include <stdbool.h>
 #include <sys/stat.h>
 #include <errno.h>
+#include <inttypes.h>

 #include "closein.h"
 #include "tailor.h"
@@ -694,7 +695,7 @@

     if (verbose) {
         if (test) {
-            fprintf(stderr, " OK\n");
+            fprintf(stderr, " OK (%jd bytes)\n", (intmax_t) bytes_out);

         } else if (!decompress) {
             display_ratio(bytes_in-(bytes_out-header_bytes), bytes_in, stderr);
@@ -901,7 +902,7 @@
     /* Display statistics */
     if(verbose) {
         if (test) {
-            fprintf(stderr, " OK");
+            fprintf(stderr, " OK (%jd bytes)", (intmax_t) bytes_out);
         } else if (decompress) {
             display_ratio(bytes_out-(bytes_in-header_bytes), bytes_out,stderr);
         } else {
11
Stephen Kitt

どうですか

gzip -l file.gz|tail -n1|awk '{print $2}'

numfmt --to=iec $(gzip -l file.gz|tail -n1|awk '{print $2}')
0
Syco

圧縮ファイルまたはファイルセットのサイズが必要な場合、gzipには非圧縮ファイルが含まれるため、tarではなくtar -zまたはtar -jを使用するのが最善の策です。サイズ。 lesspipeを使用して、ファイルのリストを確認します。

aptitude install lesspipe
lesspipe <compressed file> | less

lesslesspipeを使用するように構成されている場合:

less <compressed file>

ただし、非常に時間がかかることを覚えておいてください。ただし、システムは応答性を維持しているため、解凍プロセスを強制終了できます。

別のアプローチは、圧縮率をログに記録し、代わりにその[テキスト]ファイルをクエリすることです。

gzip --verbose file 2>&1 | tee file.gz.log
file:    64.5% -- replaced with file.gz

ただし、実際のファイルサイズを見つけるには計算が必要です。

たとえばtarでも同じことができます。これは実際に大きなサイズのバックアップで行うことです。たとえば、解凍プロセス全体を実行してファイルサイズやファイル名のみを取得することを防ぐためです。

0
user86969