2017-11-22 13 views
0

d:\workディレクトリにある.tgzファイル(ディレクトリツリー/ファイルを含む)を抽出し、変更して再パックする必要があります。 .tgz番目のファイル \フォルダ123a、多くのサブフォルダが含まれているので、 は、抽出されたフォルダには、(D:\work\123a\...のようになります は、今私はArchive::Tarを使用して再帰的にパックしようとしましたが、問題は「仕事」フォルダも圧縮されている - 。。だから、意志この「作品」フォルダ(CWDまたはルートディレクトリ)を除外するためにどのように\work\123a\... こと すべてのヘルプは高く評価され 私のコード:。。Perl Archive :: Tarルートディレクトリを除外する方法

my $tar = Archive::Tar->new;   
    $tar->read("$tgzfiles[0]"); 
    $tar->extract(); 
    (my $tgzfolder = $tgzfiles[0]) =~ s/\.[^.]+$//;  

     # Here I make some changes in content{.....} 

    our $arc = Archive::Tar->new(); 
    find(\&archiveit, "d:/work/$tgzfolder"); 
    $arc->write("$tgzfiles[0]", 9); 


    sub archiveit { 
      $arc->add_files($File::Find::name); 

    } 
+0

それが含ま見つけ、それはハイテク、それはすでにある – Borodin

答えて

1

私のために、次の作品の初期test.tgzは、ホームフォルダにあります。 。

作業ディレクトリに切り替えるのにchdirを使用しましたが、no_chdirオプションをwanted機能に追加する必要があり、ディレクトリをサブディレクトリに変更しないようにしました。

また、$ tgzfolderは、抽出されたファイルへのパスである必要があります。そのため、名前からではなくアーカイブの内容から抽出する必要があります。

#!/usr/bin/perl 
use warnings; 
use strict; 

use Archive::Tar; 
use File::Find; 

my @tgzfiles = "$ENV{HOME}/test.tgz"; 

chdir 'd:/work'; 

my $tar = 'Archive::Tar'->new; 
$tar->read($tgzfiles[0]); 
$tar->extract; 

# Modify the contents. 

my $tgzfolder = ($tar->list_files)[0]; 

my $arc = 'Archive::Tar'->new; 
find({wanted => sub { $arc->add_files($File::Find::name) }, 
     no_chdir => 1}, 
    $tgzfolder); 
$arc->write($tgzfiles[0], 9); 
+0

読めるように適切にあなたのコードをレイアウトするが、それでも、多分これのために同じことしてください作業ディレクトリあまりに:$ ARC-> add_files($ファイル: :Find :: name); – Shivaram

+0

@tgzfilesの内容は何ですか? – choroba

+1

アップデートを確認してください。私は多くを推測しなければならなかった、次回はすべての詳細を提供しようとしてください。 – choroba

関連する問題