큰 GZIPPED 파일의 압축되지 않은 크기를 처리하는 가장 빠른 방법 “압축되지 않은”열에 uncompressed value modulo

파일이 압축되면 압축되지 않은 파일 크기가 무엇인지 (압축하지 않은 상태), 특히 압축되지 않은 파일의 크기가 4GB보다 큰 경우 신속하게 쿼리하는 방법이 있습니까?

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는 위에서 설명한대로 바닥 글을 읽을 때 다시 포함 됩니다.

압축을 풀지 않은 파일 크기를 먼저 압축 해제하지 않고 파일 크기를 얻는 방법이 있는지 궁금합니다.이 방법은 압축 된 파일에 50GB 이상의 데이터가 포함되어 있고 gzcat foo.gz | wc -c


편집 : 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.



답변

가장 빠른 방법은 수정 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 {


답변

압축 파일 또는 파일 세트의 크기가 필요한 경우 압축되지 않은 파일 크기 를 포함 tar -z하거나 tar -j대신 사용하는 것이 가장 좋습니다 . 파일 목록을 엿볼 때 사용하십시오 .gziptarlesspipe

aptitude install lesspipe
lesspipe <compressed file> | less

다음 less을 사용하도록 구성된 경우 lesspipe:

less <compressed file>

그래도 시간이 오래 걸릴 수 있음을 명심하십시오. 그러나 시스템의 응답 성이 유지되어 압축 해제 프로세스를 종료 할 수 있습니다.

또 다른 방법은 압축 비율을 기록하고 대신 [text] 파일을 쿼리하는 것입니다.

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

그래도 실제 파일 크기를 찾으려면 계산이 필요합니다.

예를 들어 tar전체 압축 풀기 프로세스를 통해 파일 크기 또는 이름 만 가져 오는 것을 방지하기 때문에 실제로 큰 크기의 백업으로 수행하는 작업 인으로도 동일한 작업을 수행 할 수 있습니다 .


답변

이건 어떤가요

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

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


답변

gunzip -c $file | wc -c

시간이 오래 걸리지 만 최종 크기 (바이트)를 제공합니다.


답변