在perl中遍历.gz

时间:2014-02-17 09:02:59

标签: perl file perl-module

我想遍历.gz文件并读取文件内容。

我的文件夹结构: 1)ABC.gz   1.1)ABC     1.1.1)Sample1.txt     1.1.2)Sample2.txt     1.1.3)Test1.txt

我想遍历.gz,然后读取并打印Sample * .txt文件的内容。 测试* .txt应该被忽略。重要的是,我不想将gz复制/提取到其他位置。

Perl脚本我必须阅读文件:

use strict;
use warnings;

my $filename = 'Sample1.txt';
open(my $fh, '<:encoding(UTF-8)', $filename)
  or die "Could not open file '$filename' $!";

while (my $row = <$fh>) {
  chomp $row;
  print "$row\n";
}

2 个答案:

答案 0 :(得分:1)

首先,gzip文件是单个文件的压缩版本。根据您的描述,您很可能拥有一个tar压缩文件,然后进行压缩。

第二点是你必须在内存或临时文件中解压缩它。

你肯定无法逐行阅读。

请查看Tie::Gzip以处理压缩文件,并在Archive::Tar查看tar档案。

答案 1 :(得分:0)

也许是这样的:

#!/usr/bin/perl -w

use IPC::System::Simple "capture";
use File::Path qw[ make_path remove_tree ];

use warnings;
use strict;

my $tar = "/path/to/archive.tar.gz";    
my @list = capture("tar tzf $tar | awk '{print \$NF}'");
my $tmp_path = "/your/tmp/path";
make_path($tmp_path) if not -e $tmp_path;

foreach my $file (@list) {
  if ($file =~ /(Sample*\.txt)$/) {

    my $out = capture("tar xzf $tmp_path/$1 -O");
    print "$out\n";
    #unlink $tmp_path/$1;
  }
}
remove_tree($tmp_path);