在‘tar -cvpfz ...’末尾添加 tar‘-z’(gzip)参数无法按预期工作

在‘tar -cvpfz ...’末尾添加 tar‘-z’(gzip)参数无法按预期工作

我使用的是复制文件而不丢失文件/文件夹权限问题,当我遇到这种有趣且出乎意料的行为时。

使用tar cvpfz target.tar.gz dir1效果很好,它基本上是上面链接的问题的建议答案中列出的命令的结构。

-然而,奇怪的是,当我在参数前添加可选项时(即tar -cvpfz ...,认为这只是一种风格上的变化),奇怪的事情就出现了。

$ tar -cvpfz target.tar.gz dir1
tar: target.tar.gz: Cannot stat: No such file or directory
...
tar: Exiting with failure status due to previous errors

更奇怪的是,虽然tar -cvpfz ...抛出了上述错误,但该命令实际上有效,但它不是创建一个 gzip 文件,而是创建一个同名的 tar 文件z(尽管它仍然会抛出错误)。

如果我执行tar -tvf z,它会正确列出 tar 的内容。如果我执行tar -ztvf z,它会说它没有经过 gzip 压缩。

我最终发现将命令改为 可以tar -zcvpf完美运行。不知何故,将z参数放在第一位可以正常工作,但是将其放在最后(即tar -cvpfz ...)则不行!

man tar似乎表明是-可选的,并且人们会认为 tar 命令无论有没有都应该能够正常工作-

希望这能够帮助其他人,像我一样,添加了-,认为这只是一种不会改变命令的风格差异。

因为我很好奇,并且很想了解更多,有人可以解释一下为什么会发生这种情况吗?

答案1

选项-f后面应该跟一个文件或设备名称。使用时,tar cvpfz target.tar.gz dir1您实际上使用的是所谓的“旧选项样式”,其中

当需要参数的选项与命令一起给出时,所有相关参数都会按照与选项相同的顺序出现。(tar 信息页面)

答案2

Muru 确实通过他发布的链接回答了这个问题,但由于他的鼓励,我将重新复制他的一个链接并在此重述我的评论,希望能更容易地看到答案。

根据此 StackExchange 链接f该命令的参数tar有些特殊,因为f如果您在参数前面加上-(例如tar -cf),则它需要一个紧跟在参数后面的参数(存档文件名)。但是,正如链接中的答案所提到的,放弃 可能更安全-,因此该f参数不会冒险将您可能放在 后面的任何参数视为f文件名。

这是我在问题中遇到的问题,因为我试图将参数放在(例如)z之后,这导致 tar 命令贪婪地“消耗”并将其视为参数的存档文件名参数,而不是简单地将视为命令的 gzip 参数。ftar -cvpfzzfztar

简而言之,通过省略-(例如使用tar cvpfz... 而不是tar -cvpfz..),可以避免我遇到的问题。现在我知道为什么了。谢谢,muru!

相关内容