gzip 아카이브의 후행 데이터를 얻는 방법?


10

후행 데이터가있는 gzip 아카이브가 있습니다. 내가 그것을 사용하여 압축을 풀면gzip -d " 감압 해제, 후행 가비지 무시 됨 "( gzip -t이러한 데이터가 있음을 감지하는 방법으로 사용될 수 있음)이 나옵니다.

이제이 쓰레기를 알고 싶습니다만, 이상하게도 그것을 추출 할 방법을 찾지 못했습니다. gzip -l --verbose아카이브의 "압축 된"크기는 파일의 크기 (즉, 후행 데이터 포함)이며 잘못되었으며 도움이되지 않습니다. file또한 도움이되지 않으므로 어떻게해야합니까?

답변:


10

후행 데이터를 얻는 방법을 알아 냈습니다.

나는 그것이 무겁게 기반으로, 후행 데이터 파일을 생성 펄 스크립트를 생성 https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=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이지만 IMO는 원본과 같이 stdout으로 인쇄하지만 줄 바꿈을 추가하지 않고 하드 코딩 된 파일 이름을 쓰는 것보다 낫습니다. 파일로 경로 재 지정하거나 파이프로 less또는 hd기타로 파이프 할 수 있습니다 hd | less.
cas

@cas : 입력 해 주셔서 감사합니다. 지금 약간의 매개 변수 처리가 추가되었습니다. 나의 첫 번째 펄 스크립트 BTW, 나는 언젠가 시간이 올 것이라는 것을 알았다.
phk

1
좋은 개선. 내가 할 수 있다면 다시 그것을 찬성 :) 하나 더 아이디어-이와 같은 프로그램은 실제로 입력 파일이 필요하지 않으며 stdin을 처리하는 것만 큼 잘 작동합니다. 과 while (<>)의 루프 perl(작업 똑같이뿐만 아니라 필터 (즉, 표준 입력, 표준 출력으로 쓰기 읽기) 것을 쓰기 스크립트에 쉽게 그것을 만들고 이름 파일이 .... stdin을하고 파일 @ARGV에 나열된 (들)들 읽 ). 물론 stdout은 항상 파일로 리디렉션 될 수 있습니다. 내 펄 스크립트의 대부분은 이것을 활용하기 위해 필터로 작성됩니다.
cas

1
push @ARGV,'-' if (!@ARGV);전에 my $input_file_name = shift;여기에 필요한 모든 것을입니다. 즉 기본 인수 인 -$ ARGV [0] == '-h'또는 '--help'인 경우 도움말 메시지가 인쇄 될 수 있습니다. while(<>)루프의 경우에는 그렇게 할 필요조차 없지만를 위해 쓰는 것보다 더 큰 문제 일 것입니다 IO::Uncompress::Gunzip.
cas

2
괜찮아. push 대신 unshift는 그것을 사용하는 방법에 의미가 있지만 여전히 출력 파일 이름을 유일한 인수로 지정할 수 있습니다. 나는 개인적으로 사용자의 명시 적 순서없이 파일을 덮어 쓰는 것을 피하고 있습니다-리디렉션 또는 -o옵션 또는 무언가. 스크립트가 자동으로 두 개의 입력 중 첫 번째 인수에서 첫 번째 인수로 전환하고 출력되는 인수 만 위험하고 사고가 발생하기 쉬운 것처럼 보입니다 (마법을 시도).
cas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.