将tar文件存档到Perl中的其他位置

时间:2010-04-12 06:33:53

标签: perl file extract

我正在阅读一个包含一些存档文件的目录,并逐个解压缩存档文件。

一切似乎都很好但是文件在具有运行子模块的主perl代码模块的文件夹中得到了解压缩。

我希望在我指定的文件夹中生成存档。

这是我的代码:

sub ExtractFile
{

 #Read the folder which was copied in the output path recursively and extract if any file is compressed
 my $dirpath = $_[0];

 opendir(D, "$dirpath") || die "Can't open dir $dirpath: $!\n";
 my @list = readdir(D);
 closedir(D);


 foreach my $f (@list) 
 {
  print " \$f = $f";
  if(-f $dirpath."/$f")
  {
   #print " File in  directory $dirpath \n ";#is \$f = $f\n";

   my($file_name, $file_dirname,$filetype)= fileparse($f,qr{\..*});

   #print " \nThe file extension is $filetype";
   #print " \nThe file name is is $file_name";


   # If compressed file then extract the file
   if($filetype eq ".tar" or $filetype eq ".tzr.gz")
   {

    my $arch_file = $dirpath."/$f";
    print "\n file to be extracted is $arch_file";
    my $tar = Archive::Tar->new($arch_file);
    #$tar->extract() or die ("Cannot extract file $arch_file");

    #mkdir($dirpath."/$file_name");
    $tar->extract_file($arch_file,$dirpath."/$file_name" ) or die ("Cannot extract file $arch_file");
   }

  }
  if(-d $dirpath."/$f")
  {
   if($f eq "." or $f eq "..")
   { next; }
   print " Directory\n";# is $f";
   ExtractFile($dirpath."/$f");
  }

 }


}

递归调用ExtractFile方法以循环所有归档。 使用$tar->extract()时,它会在调用此方法的文件夹中解压缩。

当我使用$tar->extract_file($arch_file,$dirpath."/$file_name")时出现错误:

  

存档中没有此类文件:/home/fsang/dante/workspace/output/s.tar'/home/fsang/dante/lib/Extraction.pm第80行

请帮助我检查了该路径并输入输出没有问题。

似乎我不了解$tar->extract_file()的一些使用问题。

非常感谢任何人解决这个问题。

此致 Sakshi

4 个答案:

答案 0 :(得分:2)

你误解了extract_file。第一个参数是要提取的存档内的文件名。你正在传递档案本身的路径。你把它传递给new;你不需要再次传递它。正如错误消息所述,s.tar不包含名为/home/fsang/dante/workspace/output/s.tar的文件,因此extract_file失败。

您可以使用$tar->list_files获取档案中的文件列表。

更简单的解决方案可能是临时chdir到您要将存档解压缩到的目录。 File::pushd提供了一种简单的方法。

答案 1 :(得分:0)

一个错字?

$tar->extract_file($arch_file,$dirpath."/$file_name" ) 

应该是

$tar->extract_file($arch_file,$dirpath."/".$file_name) 

答案 2 :(得分:0)

$tarFile = "test.tar.gz";
$myTar = Archive::Tar->new($tarFile);
foreach my $member ($myTar->list_files())
{
    my $res = $myTar->extract_file( $member , 'C:/temp/'.$member );
    print "Exract error!\n" unless ($res);
}

答案 3 :(得分:0)

我看到一把枪被带到了瑞士军刀的战斗中。 这是一个* nix单行程,可以满足您的需求:

find /source/dir -name "*.tar" -exec tar -C /target/dir -xvzf '{}' \; -print

是否需要为此编写脚本? 除了调试行之外,您不一定要做任何特殊的事情。