5

我正在使用下面的 Perl 代码来列出 tar 存档中的文件。tar 存档的大小始终约为 15MB。

my $file = shift;
my $tar = Archive::Tar->new("$file");
my @lists = $tar->list_files;
$tar->error unless @lists;

执行此代码会给我一个错误“内存不足”。我的 Linux 系统中有大约 512MB,我不想增加系统的内存。任何人都可以建议我是否可以修改此代码以获得更好的性能或其他代码以列出 tar 存档中的文件。

4

3 回答 3

6

常见问题解答Archive::Tar

Archive::Tar 不是很慢吗?是的。它是纯粹的 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/

于 2009-11-10T12:28:08.323 回答
3

我在一个大的焦油上试过了,但也出错了。可能是库中的错误。以下对我有用:

@files = split/\n/, `tar tf $file`
于 2009-11-10T10:00:05.787 回答
0

如果 Perl 不是必须的,请使用 tar

$ tar tvf file.tar
于 2009-11-10T10:35:16.047 回答