我使用下面的Perl代码列出tar存档中的文件。 tar存档的大小总是大约15MB。
my $file = shift;
my $tar = Archive::Tar->new("$file");
my @lists = $tar->list_files;
$tar->error unless @lists;
执行此代码会给出错误“Out of Memory”。我的Linux系统中大约有512MB,我不想增加系统内存。任何人都可以建议我,如果可以修改此代码以获得更好的性能,或者在tar存档中列出文件的其他代码。
答案 0 :(得分:6)
来自Archive::Tar
FAQ:
不归档::焦油慢吗? 是的。它是纯粹的perl,所以它比你的/ bin / tar慢很多但是,它非常便携。如果速度是个问题,请考虑使用/ bin / tar。
不是Archive :: Tar在内存上比/ bin / tar更重? 是的,见上一个答案。由于Compress :: Zlib以及因此IO :: Zlib不支持在其文件句柄上进行搜索,因此除了将存档读入内存之外别无选择。如果您想对存档进行内存操作,这是可以的。
如果您只想提取,请改用extract_archive类方法。它会立即优化并写入磁盘。
另一个选择是使用iter类方法迭代tarball中的文件,而不是一次在内存中读取它们。
因此,基于上述情况,这应该是解决方案(未经测试):
my $next = Archive::Tar->iter( $file );
while ( my $f = $next->() ) {
say $f->name;
}
/ I3az /
答案 1 :(得分:3)
我在大型焦油上尝试过这个并且也出错了。可能是libs中的一个bug。 以下对我有用:
@files = split/\n/, `tar tf $file`
答案 2 :(得分:0)
如果Perl不是必须的,请使用tar
$ tar tvf file.tar