为什么 -z 不能成为与 tar 一起使用的最后一个命令行选项?

Laz*_*zer 8 linux command-line tar flag

$ ls one.tar.gz
one.tar.gz
$ tar -xvfz one.tar.gz
tar: z: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now
$ tar -xvzf one.tar.gz
one
$ tar -xzvf one.tar.gz
one
$ tar -zxvf one.tar.gz
one
$
Run Code Online (Sandbox Code Playgroud)

Den*_*son 18

-f开关需要一个参数(文件名)。如果z出现在 之后,f则将其视为文件名。

tar -xvfz one.tar.gz
Run Code Online (Sandbox Code Playgroud)

是相同的

tar -xvf z one.tar.gz
Run Code Online (Sandbox Code Playgroud)

如果你这样做了:

tar -xvf -z one.tar.gz
Run Code Online (Sandbox Code Playgroud)

then-z会被当作文件名,你会得到类似的错误。

然而,这会奏效:

tar -xvz -f one.tar.gz
Run Code Online (Sandbox Code Playgroud)

GNUtar手册页指出:

tar 的第一个参数必须是以下选项之一:Acdrtux,后跟任何可选函数。tar 的最后一个参数是应该归档的文件或目录的名称。

请注意,除非输入来自 stdin 或输出到 stdout(在适当的情况下),-f filename否则必须给出选项和参数。虽然手册页暗示顺序是固定的,但实际上选项可以按任何顺序排列。即使是这个奇怪的工作(但它可能不适用于所有版本tar):

tar -v files_to_archive* -f xyz.tar.gz -cz
Run Code Online (Sandbox Code Playgroud)

为了可移植性,最好坚持惯用的参数顺序,甚至去掉连字符:

tar czvf xyz.tar.gz files_to_archive*
Run Code Online (Sandbox Code Playgroud)


小智 6

z可以最后使用:

tar -x -v -f foo.tar.gz  -z
Run Code Online (Sandbox Code Playgroud)

但正如@Dennis 所说,f标志需要一个参数。