使用-C选项和通配符来压缩tar文件

3
我在一个应用程序中将tar命令传递给shell执行器。但似乎我的tar语法不正确。(这是Windows(bsdtar命令),但据我所知与Linux相同;如果需要,也可以在Linux上进行测试。)
我试图对以ext结尾的所有文件进行tar gz压缩,而不在tar文件中存储完整路径。
tar -cvzf test.tar.gz -C C:/mydir/toTar/ *.ext

我遇到一个错误:
tar: *.ext: Cannot stat: No such file or directory

我可以提供整个路径,但是我的tar包将包含C->mydir->toTar->。我只想要文件,不需要在结果中包含mydirtoTar
到目前为止,唯一接近我所需的东西是使用 * .ext 代替,但这也会打包其他不需要的东西。

我可以进入目录,然后执行我的tar命令,但在我的情况下,由于我将命令传递给其他东西来执行,所以我不能这样做。一次只能执行一个命令。 - dlite922
1
除非有特别指定,否则tar不会进行通配符扩展;而是由shell完成。bsdtar似乎采用了选项--include='*.ext',所以可以尝试使用该选项代替*.ext参数。您可能需要这些单引号来防止shell扩展在应用程序调用tar命令的任何目录中的*.ext。 - Mark Plotnick
哦,我忘记了 include。Rsync 也有这个选项,我已经成功地使用过了。也许我会试试这个。它还需要一个参数吗?(tar 的文件列表参数?) - dlite922
3个回答

3
问题在于 * 是一个通配符,它被 shell 扩展,但是你绕过了 shell 直接调用 tartar 命令正在寻找一个名为*.ext 的文件,而这个文件实际上不存在。
你的选择有:
  1. 在你自己的代码中扩展文件列表并将该列表传递给 tar
  2. 从你的代码中调用 shell,例如调用 /bin/sh -c tar ...
使用第二种选项可能存在安全隐患——如果 shell 看到了它认为是命令的东西,它会运行它。因此,选项1更加安全,但哪个选项更有意义由你决定。

是的,那正是问题所在。Shell会扩展它。我希望有一种方法可以让tar扩展它(比如用双引号包裹它)。 由于选项是内部生成的,并不受第三方输入的影响,所以我认为它们不会受到第三方攻击的影响。我选择选项1,因为它更简洁,尽管需要添加几个for循环来从不同的位置获取所有文件名。嗯。 感谢您的帮助。 - dlite922

1
我对您在一个类似Linux的上下文中使用dos风格路径感到困惑。但这是我会做的方式。希望概念清晰,细节可能不正确。
cd C:/mydir/toTar/
mkdir ~/tmpwork
find . -name '*.ext' > ~/tmpwork/extfiles
tar czvfT ~/tmpwork/test.tar.gz ~/tmpwork/extfiles
rm ~/tmpfiles/extfiles

2
可能是Cygwin环境的问题。 - Lars Brinkhoff

-1

如果不使用管道等方法,就无法避免 shell 扩展。


1
请您提供一个例子,好吗? - polkovnikov.ph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接