我使用的是复制文件而不丢失文件/文件夹权限问题,当我遇到这种有趣且出乎意料的行为时。
使用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 参数。f
tar -cvpfz
z
f
z
tar
简而言之,通过省略-
(例如使用tar cvpfz
... 而不是tar -cvpfz
..),可以避免我遇到的问题。现在我知道为什么了。谢谢,muru!