tar -C 带有通配符文件模式

tar -C 带有通配符文件模式

我可以使用 tar 命令来更改目录并使用通配符文件模式吗?

以下是我想做的事情:

tar -cf example.tar -C /path/to/file *.xml

如果我不更改目录(-C),它就可以工作,但我试图避免在 tar 文件中使用绝对路径。

tar -cf example.tar /path/to/file/*.xml

以下是我所做的其他一些尝试:

tar -cf example.tar -C /path/to/file *.xml
tar -cf example.tar -C /path/to/file/ *.xml
tar -cf example.tar -C /path/to/file/ ./*.xml
tar -cf example.tar -C /path/to/file "*.xml"

这是我得到的错误:

tar: *.xml: Cannot stat: No such file or directory

我知道还有其他方法可以完成这项工作(使用 find、xargs 等),但我希望只使用 tar 命令来完成此操作。

有任何想法吗?

答案1

问题是,*.xml 由 shell 解释,而不是 tar。因此,它找到的 xml 文件(如果有)位于您运行 tar 命令的目录中。

您必须使用多阶段操作(可能涉及管道)来选择所需的文件,然后对其进行 tar 处理。

最简单的方法就是cd进入文件所在的目录:

$ (cd /path/to/file && tar -cf /path/to/example.tar *.xml)

应该管用。

括号将命令组合在一起,因此当它们完成后,您仍将位于原始目录中。&& 表示tar只有在初始命令cd成功后才会运行。

答案2

在您的一次尝试中:

tar -cf example.tar -C /path/to/file "*.xml"

* 字符确实传递给了 tar。但问题是 tar 仅支持对档案成员的名称进行通配符匹配。因此,虽然您可以在提取或列出档案中的成员时使用通配符,但在创建档案时不能使用通配符。

在这种情况下,我经常求助于 find(就像您已经提到的那样)。如果您有 GNU find,它有一个不错的选项,可以使用 -printf 选项仅打印相对路径:

find '/path/to/file' -maxdepth 1 -name '*.xml' -printf '%P\0' \
| tar --null -C '/path/to/file' --files-from=- -cf 'example.tar'

答案3

可接受的答案假设文件来自单个目录。如果您使用多个-C选项,则需要更通用的方法。以下命令让 shell 扩展文件名,然后将其传递给柏油

tar -cf example.tar -C /path/to/file $(cd /path/to/file ; echo *.xml)

答案4

尝试命令

tar -cvf *.xml example.tar  

它应该可以正常工作。

相关内容