Làm thế nào tôi có thể có được kích thước không nén của tệp gzip mà không thực sự giải nén nó?


23

Vui lòng tìm chi tiết hệ điều hành của tôi:

$ uname -a
AIX xxyy 1 6 000145364C00

Tôi đã thử lệnh sau để lấy kích thước tệp trong kho lưu trữ gzip:

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

Không chắc chắn làm thế nào để giải thích kích thước giải nén từ này. Kích thước tệp nén gần 4 GB.

Vì vậy, tôi đã thử tùy chọn này để thu thập dữ liệu chính xác:

$ zcat mycontent.DAT.Gz | wc -c

Nó cho tôi lỗi này:

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

Bạn có thể vui lòng cho tôi biết làm thế nào để nắm bắt giá trị này từ shell script mà không giải nén tệp nguồn không?


Bạn có chắc chắn về tính toàn vẹn của kho lưu trữ? Nó báo cáo kích thước nén riêng của nó là ~ 1.7G. Nếu nó thực sự ~ 4GB tôi sẽ đoán có vấn đề.
terdon

Câu trả lời:


22

Để trả lời tiêu đề câu hỏi:

Làm thế nào tôi có thể có được kích thước không nén của tệp gzip mà không thực sự giải nén nó?

Như bạn rõ ràng biết, tùy chọn -l( --list) thường hiển thị kích thước không nén.
Những gì nó hiển thị không được tính toán từ dữ liệu, nhưng được lưu trữ trong tiêu đề như một phần của tệp nén.

Trong trường hợp của bạn, -ltùy chọn không hoạt động vì một số lý do.
Nhưng không thể 'đo' kích thước không nén từ dữ liệu nén thô - không có thông tin về bất kỳ thứ gì khác trong dữ liệu nén - điều này không đáng ngạc nhiên, vì điểm nén là không thể bỏ qua bất cứ thứ gì không cần thiết.

Bạn không cần lưu trữ dữ liệu không nén trên đĩa: zcat file.gz | wc -clà cách tiếp cận phù hợp - nhưng như @OleTange đã trả lời, zcatdường như bạn không phải là người từ đó gzip.
Cách khác là sử dụng các gziptùy chọn -d( --decompress) và -c( --to-stdout), kết hợp với wctùy chọn -c( --bytes):

gzip -dc file.gz | wc -c

12
Các -ltùy chọn có một lỗi cho tập tin lớn hơn 4GB: bugs.debian.org/cgi-bin/bugreport.cgi?bug=149775
Flimm

5

Bạn zcatkhông phải là GNU zcat mà là từ nén. Thử:

gzcat mycontent.DAT.Gz | wc -c
gzip -dc mycontent.DAT.Gz | wc -c

Điều này giải nén tập tin nguồn. Có lẽ đó là những gì OP muốn, nhưng đây không phải là câu trả lời cho câu hỏi.
Marco

À, điều đó giải thích tại sao nó lại tìm kiếm một tập tin kết thúc bằng .Z
Hennes

0

gzip -l không hoạt động với tôi, chỉ git -1 ... nhưng điều này đã làm:

unzip -l file.zip

0

Tôi đang tìm mọi thứ trên web và không giải quyết vấn đề này kích thước có được khi kích thước tệp lớn hơn 4GB.

giải pháp của tôi là thế này :

[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

để lấy tổng kích thước từ tệp gz:

[oracle @ base tmp] $ echo $ (hết thời gian --signal = SIGINT 1s tar -tvf oracle.20180303.030001.dmp.tar.gz | awk '{print $ 3}') | grep -o '[[: chữ số:]] *' | awk '{sum + = $ 1} END {in tổng}'
    6667023572

1
Đây sẽ là một câu trả lời tốt hơn nếu bạn giải thích rằng nó chỉ hoạt động cho tarball và bạn đã làm sạch nó (thời gian chờ là không cần thiết, và cũng không phải là grep).
kbolino
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.