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


17

我可以使用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命令来完成此任务。

有任何想法吗?

Answers:


18

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

您将必须使用多阶段操作(可能涉及管道)来选择所需的文件,然后将其压缩。

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

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

应该管用。

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


9

在您的一种尝试中:

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

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

在这种情况下,我通常会寻找(就像您已经提到的那样)。如果您有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'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.