我可以使用 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
它应该可以正常工作。