首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解压缩::Gunzip在“连接”Gunzip文件中的第一个“原始”Gunzip文件之后停止。

解压缩::Gunzip在“连接”Gunzip文件中的第一个“原始”Gunzip文件之后停止。
EN

Stack Overflow用户
提问于 2016-12-08 17:56:08
回答 1查看 232关注 0票数 2

bash中,您可以连接gzipped文件,结果是一个有效的gzipped文件。据我所知,我一直能够将这些“级联”的gzipped文件视为普通的gzipped文件(我的示例代码来自上面的链接):

代码语言:javascript
复制
echo 'Hello world!' > hello.txt
echo 'Howdy world!' > howdy.txt
gzip hello.txt 
gzip howdy.txt

cat hello.txt.gz howdy.txt.gz > greetings.txt.gz

gunzip greetings.txt.gz

cat greetings.txt

哪种输出

代码语言:javascript
复制
Hello world!
Howdy world!

但是,当试图使用Perl的模块读取同一个文件时,它不会超过第一个原始文件。结果如下:

代码语言:javascript
复制
./my_zcat greetings.txt.gz
Hello world!

下面是my_zcat的代码:

代码语言:javascript
复制
#!/bin/env perl
use strict;
use warnings;
use v5.10;

use IO::Uncompress::Gunzip qw($GunzipError);

my $file_name = shift;

my $fh = IO::Uncompress::Gunzip->new($file_name) or die $GunzipError;

while (defined(my $line = readline $fh))
{
    print $line;
}

如果我在创建一个新的压缩文件之前完全解压缩这些文件,那么我没有这个问题:

代码语言:javascript
复制
zcat hello.txt.gz howdy.txt.gz | gzip > greetings_via_zcat.txt.gz
./my_zcat greetings_via_zcat.txt.gz
Hello world!
Howdy world!

那么,greetings.txt.gzgreetings_via_zcat.txt.gz之间的区别是什么?为什么IO::Uncompress::Gunzip可以正确地与greetings.txt.gz一起工作?

基于这个回答另一个问题,我猜IO::Uncompress::Gunzip是因为文件之间的元数据而搞砸的。但是,由于greetings.txt.gz是一个有效的Gzip文件,我希望IO::Uncompress::Gunzip能够工作。

我现在的解决办法是使用zcat (当然,这对Windows用户没有多大帮助):

代码语言:javascript
复制
#!/bin/env perl
use strict;
use warnings;
use v5.10;

my $file_name = shift;

open(my $fh, '-|', "zcat $file_name");

while (defined(my $line = readline $fh))
{
    print $line;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-08 19:50:00

在IO::Compress部分处理连接的gzip文件中显式地介绍了这一点。基本上,在构造IO::Uncompress::Gunzip对象时,只需包含MultiStream选项即可。

下面是一个选项

MultiStream => 0|1 如果输入文件/缓冲区包含多个压缩数据流,则此选项将将整批数据解压缩为单个数据流。 默认为0。

所以你的代码需要这个改变

代码语言:javascript
复制
my $fh = IO::Uncompress::Gunzip->new($file_name, MultiStream => 1) or die $GunzipError;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41045834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档