使用-C选项和通配符的tar文件

时间:2013-10-30 23:50:02

标签: linux windows file tar bsdtar

我将tar命令传递给应用程序中的shell执行程序。但似乎我的tar语法不正确。 (这是Windows(bsdtar命令),但据我所知,它与Linux的工作方式相同;如果需要,我也可以在Linux上进行测试。)

我试图将所有以ext结尾的文件中的所有内容tar,而不将完整路径存储在我的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,但那也是其他的东西,我显然不想要。

3 个答案:

答案 0 :(得分:3)

问题是*是一个由shell扩展的通配符,但是你绕过shell并直接调用tartar命令正在查找一个名为*.ext的文件,但该文件不存在。

您的选择是:

  1. 展开您自己代码中的文件列表,并将该列表传递给tar
  2. 通过调用类似/bin/sh -c tar ...
  3. 的内容,从您的代码中调用shell

    使用选项2可能会产生安全隐患 - 如果shell看到它认为是命令的内容,它将运行它。选项1因此更安全,但它更适合您,这更有意义。

答案 1 :(得分: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 :(得分:-1)

如果不使用管道等,就无法进行shell扩展。