【问题标题】:create and read tar.bz2 files in perl在 perl 中创建和读取 tar.bz2 文件
【发布时间】:2012-11-28 20:23:31
【问题描述】:

我一直在尝试使用

system("tar -jcvf archive_name.tar.bz2 $my_file")

但我得到一个错误

archive_name.tar.bz2:无法打开:没有这样的文件或目录 tar:错误不可恢复:现在退出 tar: Child 返回状态 2

难道不能在 perl 中使用这种方法创建 .tar.bz2 吗?我宁愿不使用模块,但如果绝对必要,我会这样做

【问题讨论】:

  • 它是什么? archive_name.tar.bz2t.tar.bz2?
  • tar cf - my_file | bzip2 > archive_name.tar.bz2 呢?
  • 您是否建议将所有这些都放在 system() 语句中?我可以试试。 *我在粘贴错误消息时编辑了我的错误
  • 谢谢 tar cf - my_file | bzip2 > archive_name.tar.bz2 工作!你知道为什么那会奏效而我的方式不会吗?
  • 我可以推测。您的tar 版本不支持-j 选项?您的 tar 版本是针对不同且不兼容的 bzip2 库编译的?

标签: perl compression tar


【解决方案1】:

首先,您不是在Perl 中这样做。您正在生成一个运行该命令的单独进程。

如果您想在 Perl 中执行此操作,则需要使用 Archive::Tar 模块,可能还需要使用 IO::Compress::Bzip2 模块。

首先是看看你是否可以直接从命令行运行这个命令:

$ tar -jcvf archive_name.tar.bz2 $my_file

如果您无法从命令行运行 tar 命令,则不太可能使用 system 命令从 Perl 内部运行它。

你运行命令的方式,将命令和所有参数放在一个字符串中,导致 Perl 从 shell(通常是/bin/sh)运行命令。如果您使用列表中的参数运行命令,Perl 将直接运行该命令而无需 shell:

my $error = system qw( tar -jcvf archive_name.tar.bz2 $my_file );

始终检查系统命令的输出以及$? 的值。 system 命令文档有更多关于处理错误的信息。

【讨论】:

    猜你喜欢
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    相关资源
    最近更新 更多