Gzip

取消連接 gzip 文件

  • January 29, 2022

前幾天,我從遠端伺服器收集了一些日誌,然後不假思索地將文件壓縮到一個文件中,而不是將目錄添加到壓縮包中。我可以手動分離出一些日誌文件,但其中一些已經被 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

碰巧的是,ingzip -c file1 file2 > result確實gzip為每個文件創建了兩個單獨的壓縮流,甚至儲存了文件名和文件的修改時間。

它不允許您在解壓縮時使用該資訊,但您可以使用perlIO::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)在目前工作目錄中恢復文件。

引用自:https://unix.stackexchange.com/questions/687900