Gzip
取消連接 gzip 文件
前幾天,我從遠端伺服器收集了一些日誌,然後不假思索地將文件壓縮到一個文件中,而不是將目錄添加到壓縮包中。我可以手動分離出一些日誌文件,但其中一些已經被 gzip 壓縮了。所以原始文件看起來像:
ex_access.log ex_access.log.1.gz ex_access.log.2.gz ex_debug.log ex_debug.log.1.gz ex_debug.log.2.gz ex_update.log ex_update.log.1.gz ex_update.log.2.gz
並被壓縮到 exlogs.gz 中,如您所料,解壓後它是一個包含所有原始文件的文件。有沒有辦法分離出原始的gz文件,以便它們可以正常解壓縮而不是列印出二進製文件:
^_<8B>^H^H<9B>C<E8>a^@ ^Cex_access.log.1^@<C4><FD><U+076E>-Kr<9D> <DE><F7>S<9C>^W<E8><CE><F0><FF><88>y[<D5><EA>+<A1>^EHuU<A8>^K<B6><94><AA>L4E^R̤^Z^B<EA><E1><DB>}<AE>̳<B6><D6>I<C6><F8><9C><DB><C6> <F1>@G`<E6><D6><FE><E0>3<C2><C3>ٰ̆|<E4><FC><BB>#<FD><EE><B8>~9<EA>+<A7>W+<FF><FB><FF><F6><9F><FE><97><FF><E3><97><FF><FD>^Z<E3><FF><F8><E5><FF><FE><CB><C7><FF>Iy<FC>?<8E><F9>?<F3>?<EF><B5><F7><F9><BF><FF>ß<FF> [etc]
是的,我可以再次收集日誌(因為我確實有意識保持原件完好無損),但是獲得訪問伺服器的批准是一件痛苦的事情,如果可能的話,我想避免它。
編輯:我使用的命令是
gzip -c ex_* > exlogs.gz
碰巧的是,in
gzip -c file1 file2 > result
確實gzip
為每個文件創建了兩個單獨的壓縮流,甚至儲存了文件名和文件的修改時間。它不允許您在解壓縮時使用該資訊,但您可以使用
perl
’IO::Uncompress::Gunzip
模組來代替。例如:#! /usr/bin/perl use IO::Uncompress::Gunzip; $z = IO::Uncompress::Gunzip->new("-"); do { $h = $z->getHeaderInfo() or die "can't get headerinfo"; open $out, ">", $h->{Name} or die "can't open $h->{Name} for writing"; print $out $buf while $z->read($buf) > 0; close $out; utime(undef, $h->{Time}, $h->{Name}) or warn "can't update $h->{Name}'s mtime"; } while $z->nextStream;
並將該腳本稱為
that-script < exlogs.gz
,它將使用其原始名稱和修改時間(不包括未儲存的亞秒部分gzip
)在目前工作目錄中恢復文件。