【问题标题】:How do i make a "system call to tar files(along with exclude tag)" to work in Perl如何在 Perl 中进行“对 tar 文件的系统调用(连同排除标记)”
【发布时间】:2010-05-10 06:19:26
【问题描述】:

这是系统调用,我现在正在 perl 中进行 tar 文件

system("${tarexe} -pcvf $tarname $includepath") which works fine.

$tarexe -> location of my tar.exe file
$tarname -> myMock.tar
$includepath -> ./input/myMockPacketName ./input/myPacket/my2/*.wav ./input/myPacket/my3 ./input/myPacket/in.html 

现在我想使用排除标签排除一些文件,它不排除文件

system("${tarexe} -pcvf $tarname $includepath --exclude $excludepath")

$excludepath -> ./input/myMockPacketName/my3

同样的说法

${tarexe} -pcvf $tarname $includepath --exclude $excludepath  

当我在命令行中运行它时不起作用。

【问题讨论】:

  • 所以你的意思是--exclude 不起作用?
  • 当我在 perl 中使用 --exclude 标记进行系统调用时,它不会排除目录(但它会压缩包含的路径)
  • 这看起来和你问的问题非常相似stackoverflow.com/questions/2545955/…
  • @justintime 我不知道如何拨打电话(没有排除标签),现在我确实拨打了电话(带有排除标签),但它不起作用! ....谢谢!

标签: perl command-line tar


【解决方案1】:

我不知道为什么您的 --exclude 不起作用。但是当我看到 system 正在使用时,我会给你我最喜欢的 perl 建议。

不要

当然有时它们是必要的,但首先要检查是否有 CPAN 模块来代替。在这种情况下,我建议Archive::TarGzip 通常我会使用Archive::Tar 但我找不到--exclude 功能(我只是快速浏览了一下,所以它可能在那里)

【讨论】:

  • 感谢您回复我。当我在命令行中键入相同的命令时,我有 --exclude 标记工作。但是当我从 perl 的系统调用中调用相同的东西时,它不起作用。 (这里需要进行系统调用,因为需要使用我的tar.exe,根据要求)。
【解决方案2】:

不是对问题的直接回答,而是一个提示,可能会帮助您在未来解决此类问题:

而不是写

system("${tarexe} -pcvf $tarname $includepath --exclude $excludepath")

做类似的事情

my $command = "${tarexe} -pcvf $tarname $includepath --exclude $excludepath"  ;

print "About to run $command\n" ;
system $command ;

然后,您可以将生成的输出剪切并粘贴到新的终端窗口中。或者你可能会发现生成的命令不是你想象的那样。

免责声明 - 我同意大多数人的观点,他们认为使用 Perl Tar 模块会更好,但接受这样做可能是有原因的

【讨论】:

  • 感谢您的明智建议。我试过了,$command 是我所期望的(我在命令行中运行的相同命令),但输出不排除目录。你认为这些命令是特定于机器的吗?
  • 听起来问题出在 TAR 而不是 Perl。你可以试试 "tar --help" 。你可以从命令行尝试一个更简单的测试用例。
  • 这是来自 Perl 的系统调用的问题,因为相同的命令在命令行中排除了路径(带有 --exclude)。但是现在从 Perl(系统调用),它很好地压缩了包含路径,但不排除排除的路径。
【解决方案3】:

@superstar -

为了回答您的具体问题,--exclude 可能应该是“./input/myMockPacketName/my3/*”,而不是我记得的 GNU tar 中的“./input/myMockPacketName/my3”。此外,包含的文件名应该在 --exclude 内容之后;应该正确引用

但是

为什么要求告诉您如何做而不是做什么?

除非是家庭作业(在这种情况下,请提前告知)

...或者这些是某些公司通用架构团队的要求(在这种情况下,应该礼貌地教育他们行业标准的最佳实践是尽可能使用 Perl 的本机库而不是系统调用,除非有明确的理由不这样做) ...

在除这 2 种情况之外的所有其他情况下,您应该决定使用哪种方法来实现。

【讨论】:

  • 我也试过了 -> "./input/myMockPacketName/my3/*" 但它不起作用
  • 您是否尝试切换排除和包含地点?
  • 另外,您是否尝试将输出/错误重定向到文件并查看打印的内容?
  • @DVK:我尝试切换包含和排除位置的位置(徒劳)。我认为我没有收到错误,该命令很好地压缩了包含的路径,而不排除排除的路径。这是你的意思吗?如果没有,你能更详细一点。谢谢!
  • 我的意思是 tar 的输出中可能有一些 警告 并没有停止 tarring 但不知何故抱怨排除的一些问题。
猜你喜欢
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多