Làm thế nào để có được dữ liệu theo dõi của kho lưu trữ gzip?


10

Tôi có một kho lưu trữ gzip với dữ liệu theo dõi. Nếu tôi giải nén nó bằng cách sử dụng gzip -dnó sẽ cho tôi biết: " giải nén OK, bỏ qua rác " (tương tự như vậy gzip -tcó thể được sử dụng như một phương pháp phát hiện ra rằng có dữ liệu đó).

Bây giờ tôi muốn biết về rác này, nhưng thật kỳ lạ là tôi không thể tìm ra cách nào để giải nén nó. gzip -l --verbosecho tôi biết rằng kích thước "nén" của kho lưu trữ là kích thước của tệp (nghĩa là với dữ liệu theo dõi), điều đó sai và không hữu ích. filecũng không giúp được gì, vậy tôi có thể làm gì?

Câu trả lời:


10

Tìm hiểu làm thế nào để có được dữ liệu theo dõi.

Tôi đã tạo tập lệnh Perl để tạo một tệp có dữ liệu theo dõi, nó dựa rất nhiều vào https://bugs.debian.org/cgi-bin/ormsreport.cgi?orms=604617#10 :

#!/usr/bin/perl
use strict;
use warnings; 

use IO::Uncompress::Gunzip qw(:all);
use IO::File;

unshift(@ARGV, '-') unless -t STDIN;

my $input_file_name = shift;
my $output_file_name = shift;

if (! defined $input_file_name) {
  die <<END;
Usage:

  $0 ( GZIP_FILE | - ) [OUTPUT_FILE]

  ... | $0 [OUTPUT_FILE]

Extracts the trailing data of a gzip archive.
Outputs to stdout if no OUTPUT_FILE is given.
- as input file file causes it to read from stdin.

Examples:

  $0 archive.tgz trailing.bin

  cat archive.tgz | $0

END
}

my $in = new IO::File "<$input_file_name" or die "Couldn't open gzip file.\n";
gunzip $in => "/dev/null",
  TrailingData => my $trailing;
undef $in;

if (! defined $output_file_name) {
  print $trailing;
} else {
  open(my $fh, ">", $output_file_name) or die "Couldn't open output file.\n";
  print $fh $trailing;
  close $fh;
  print "Output file written.\n";
}

2
+1 nhưng IMO, in ra thiết bị xuất chuẩn như trong bản gốc (nhưng không nối thêm một dòng mới) tốt hơn là ghi vào tên tệp được mã hóa cứng. Bạn có thể chuyển hướng đến một tập tin, hoặc ống để lesshoặc hdhoặc hd | lesshoặc bất cứ điều gì.
cas

@cas: Cảm ơn bạn đã đóng góp. Đã thêm một chút xử lý tham số bây giờ. Kịch bản perl đầu tiên của tôi BTW, tôi biết thời gian sẽ đến một ngày.
phk

1
cải thiện tốt đẹp. Tôi sẽ nâng cấp nó một lần nữa nếu tôi có thể :) thêm một ý tưởng - một chương trình như thế này không thực sự cần một tệp đầu vào, nó hoạt động tốt như xử lý stdin. và một while (<>)vòng lặp perlsẽ đọc stdin và bất kỳ (các) tệp nào được liệt kê trong @ARGV .... giúp dễ dàng viết các tập lệnh hoạt động tốt như một bộ lọc (ví dụ đọc stdin, ghi vào stdout) và với (các tệp có tên) ). và stdout, tất nhiên, luôn có thể được chuyển hướng đến một tập tin. hầu hết các tập lệnh perl của tôi được viết dưới dạng các bộ lọc để tận dụng lợi thế này.
cas

1
push @ARGV,'-' if (!@ARGV);trước đây my $input_file_name = shift;là tất cả những gì cần thiết ở đây. tức là một đối số mặc định của -(thông báo trợ giúp có thể được in nếu $ ARGV [0] == '-h' hoặc '--help'.). Đối với một while(<>)vòng lặp, bạn thậm chí sẽ không cần phải làm điều đó, nhưng có lẽ rắc rối hơn là đáng để viết nó như thế IO::Uncompress::Gunzip.
cas

2
tốt rồi. và unshift thay vì đẩy có ý nghĩa đối với cách bạn muốn sử dụng nó, vẫn cho phép một tên tệp đầu ra được chỉ định là đối số duy nhất. Cá nhân tôi không thích việc các tập tin bị ghi đè mà không có một số thứ tự rõ ràng từ người dùng - chuyển hướng hoặc một -otùy chọn hoặc một cái gì đó. có một kịch bản tự động chuyển đổi từ đối số đầu tiên của hai thành đầu vào thành đầu tiên và chỉ lập luận là đầu ra có vẻ rủi ro và dễ bị tai nạn đối với tôi (cám dỗ mờ ám).
cas
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.