使用 Perl 从巨大的存档中提取单个

Posted

技术标签:

【中文标题】使用 Perl 从巨大的存档中提取单个【英文标题】:Extracting Single from huge Archive using Perl 【发布时间】:2013-09-21 17:14:04 【问题描述】:

我正在尝试使用大型“.tgz”文件中的单曲。我正在使用Archive::Tar::Streamed 模块。

这里是示例代码。

my $tar2 = Archive::Tar::Streamed->new($filename);
$fil = $tar2->next;
while($fil) 
   $_ = $fil->name;
   if(m/abc\.txt/g) 
      $fil->extract($outpath);
      $fil = $tar2->next;
   

但是迭代器不工作。它循环存档中的第一个文件,而不是移动到下一个文件。 谁能告诉我我在这里犯了什么错误???

【问题讨论】:

也许你可以使用Archive::Tar,它在核心中,也有某种流媒体支持,见:metacpan.org/module/… 我无法使用 Archive::Tar,因为我的 tgz 文件大小超过 8GB。我会遇到内存问题。 你检查过链接吗?它说“返回一个迭代器函数,该函数读取 tar 文件而不将其全部加载到内存中。”不知道是不是真的,不过应该值得一试…… @SlavenRezic.. 是的,你是对的.. 我的意思是迭代器在我的情况下不起作用.. “不工作”是一个无效的问题描述。究竟是什么问题? 【参考方案1】:

你把对next的调用放在你的if里面,所以它只有在你解压文件时才会执行。如果文件未解压缩,则不会在循环内修改 $fil

只需在 while 循环的条件下调用迭代器,就可以大大简化代码。此外,您可以使用=~ binding operator 而不是将名称存储在$_ 中。而您在此处需要/g 正则表达式修饰符。在标量上下文中,您使用 /g 循环遍历字符串中的多个匹配项。在这里,您只想知道字符串是否包含匹配项。

my $tar2 = Archive::Tar::Streamed->new($filename);
while(my $fil = $tar2->next) 
   if($fil->name =~ m/abc\.txt/) 
      $fil->extract($outpath);
   

【讨论】:

我的 tgz 文件具有以下结构 folder1 --folder2 ----folder3 -----file1 -----file2 -----file3 所以当我运行你的代码时,我得到输出,folder1/folder2/folder3/file1 folder1/folder2/folder3/file1 输出路径由$outpath控制。你没有说明它是从哪里来的。 忘记$outpath ..即使我在那个地方打印文件名,它也会一次又一次地打印ttgx文件中的第一个文件......迭代器不会移动到下一个文件..请帮助 是 Archive::Tar::Streamed 对档案内的递归文件夹不起作用???? 您可能在 Archive::Tar::Streamed 中发现了一个错误。我展示的代码不应该一遍又一遍地卡在同一个文件上。

以上是关于使用 Perl 从巨大的存档中提取单个的主要内容,如果未能解决你的问题,请参考以下文章

sh 从pg_dumpall存档中提取单个数据库

从单个字符串中提取字符串,然后删除空格

从python中的tar存档中提取压缩的gz文件

从存档中提取精确文件的快速方法

快速从存档中提取所选文件

从控制台存档的 TARBall 中提取文件