tar 退出“无法统计:没有这样的目录文件”,为什么?

ran*_*nsh 74 tar

我正在尝试使用以下命令创建 tar.gz 文件:

sudo tar -vcfz dvr_rdk_v1.tar.gz dvr_rdk/
Run Code Online (Sandbox Code Playgroud)

然后它开始创建文件(文件夹中的许多文件),但随后出现以下错误:

tar: dvr_rdk_v1.tar.gz: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
Run Code Online (Sandbox Code Playgroud)

我没有看到此错误的任何描述,这是什么意思?

小智 80

-vcfz选项中删除。tar选项不需要连字符。

使用连字符,-f选项的参数是z。因此,该命令实际上是在尝试存档dvr_rdk_v1.tar.gzdvr_rdk放入名为z. 如果没有连字符,选项的语义会发生变化,因此命令行上的下一个参数,即存档的文件名,将成为f标志的参数。

还要检查您对正在执行命令的目录的写权限。

  • @MichaelMrozek 实际上,删除 `-` 确实会有所作为,因为 GNU tar 很古怪。当第一个参数不以 `-` 开头时,选项参数不能捆绑在第一个参数中,因此 `f` 的参数是 `tar` 的下一个参数,因此 `tar vcfz dvr_rdk_v1.tar.gz`相当于`tar -v -c -f dvr_rdk_v1.tar.gz -z`。 (20认同)
  • **总结:** 如果 'f' 作为选项出现在最后一个选项之外的任何地方,那么该命令将不会执行预期的操作。我不明白当 Gnu 检测到如此严重且易于检测的问题时,他们如何无法添加警告。我只花了 40 分钟试图调试这种奇怪的东西。这一定浪费了数十万工时的生产力。 (14认同)
  • 它不需要 * 需要 * 连字符,但它们应该不是问题,它们只是可选的 (6认同)

twa*_*163 72

-f选项应直接位于文件名之前。所以,使用tar -vczf filename.tar.gz代替-vcfz

  • 啊,这解释了为什么我使用的命令试图分别使用这些命令 `-cvfj` 和 `-cvfz` 创建一个名为 `j` 或 `z` 的压缩存档文件。 (3认同)

Mar*_*ick 19

tar命令历史上一直是不遵循Unix下几个命令的一个实用程序语法准则

tar 的标准页面说:

f
使用第一个文件操作数(或第二个,如果已经指定了 b)作为存档的名称,而不是依赖于系统的默认值

虽然语法指南包括:

准则 5:
一个或多个没有选项参数的选项,后跟最多一个带有选项参数的选项,当分组在一个“-”分隔符之后时应该被接受。

因此,虽然您键入的命令tar -vcfz dvr_rdk_v1.tar.gz dvr_rdk/, 可以在旧版本的 tar 上正常运行,但某些严格遵循实用程序语法指南而编写的 tar 版本会将其解析为“z用作”的文件参数-f。因此,您应该使用以下内容进行便携:

tar -cvzf dvr_rdk_v1.tar.gz dvr_rdk/
Run Code Online (Sandbox Code Playgroud)