2014-02-17 31 views
0

我想遍歷.gz文件並讀取文件的內容。在perl中穿越.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文件的內容。 應該忽略Test * .txt。重要的是,我不想將gz複製/提取到不同的位置。

Perl腳本,我要讀文件:

全部gzip文件的
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"; 
} 

回答

1

首先是單個文件的壓縮版本。從你的描述中你很可能有一個tar壓縮文件。

第二點是,你將不得不解壓縮它,無論是在內存或臨時文件。

您一定不能逐行讀取它。

看看Tie::Gzip處理壓縮文件和Archive::Tar tar檔案。

+0

是u的正確文件被壓縮爲tar.gz的......就OK了,我們可以將文件解壓縮到一些臨時位置,我應該如何通過特定文件遍歷並打印出來? – Naga

+0

@ user3318108我添加了一個對Archive :: Tar的引用,它允許您訪問tar文件。 – Matteo

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);