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->. 我只想要文件,而不是mydir结果toTar

到目前为止,唯一接近我想要的东西是.代替*.ext,但这也会影响其他东西,我显然不想要。

4

3 回答 3

3

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

您的选择是:

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

使用选项 2 可能存在安全隐患——如果 shell 看到它认为是命令的东西,它将运行它。因此,选项 1 更安全,但更有意义取决于您自己。

于 2013-10-31T03:29:05.490 回答
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
于 2013-10-31T15:58:14.410 回答
-1

如果不使用管道等,就无法绕过外壳扩展。

于 2014-05-30T19:07:27.487 回答