我正在尝试使用tar
命令来制作带有.tar
扩展名的存档。
请看看我尝试过的以下一系列命令:
$ ls
abc.jpg hello.jpg xjf.jpg
$ tar -cfv test.tar *.jpg
tar: test.tar: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
$ ls
abc.jpg hello.jpg v xjf.jpg
$ rm v
$ ls
abc.jpg hello.jpg xjf.jpg
$ tar -cvf test.tar *.jpg
abc.jpg
hello.jpg
xjf.jpg
$ ls
abc.jpg hello.jpg test.tar xjf.jpg
为什么它对不同的选项顺序给出不同的响应?即-cfv
vs cvf
。
根据我在 bash 脚本中学到的知识,选项顺序并不重要。
答案1
正如@jcbermu 所说,对于大多数程序和大多数情况,命令行标志的顺序并不重要。然而,一些标志需要一个值。具体来说,tar 的-f
标志是:
-f, --file ARCHIVE
use archive file or device ARCHIVE
因此,tar
期望-f
有一个值,该值将是它创建的 tar 文件的名称。例如,要将所有.jpg
文件添加到名为 的存档中foo.tar
,您可以运行
tar -f foo.tar *jpg
你正在运行的是
tar -cfv test.tar *.jpg
tar
理解为“创建 ( ) 一个名为( )-c
的存档,其中包含文件和任何以.v
-fv
test.tar
.jpg
tar -cvf test.tar *.jpg
另一方面,当您运行时,它将test.tar
作为存档的名称和*jpg
文件列表。
答案2
只要选项不需要值,顺序并不重要。在你的情况下-F需要指定一个文件名。
在第一种情况下(焦油-cfv)该命令认为输出文件名是 v 因为是在之后-F。
答案3
虽然其他人指出它将其视为-c -f v
,但我觉得我应该注意,这只是因为使用了破折号而完成,并且此行为并不适用于 tar 的所有版本。在传统模式(无破折号)下,tar 特别对待第一个参数,其中的“f”或“b”将消耗下一个完整单词后选项(所以tar cfb file.tar 20
或tar cbf 20 file.tar
)。对于 GNU tar,您可以通过运行 来在完整的 Texinfo 文档中找到更多详细信息info tar styles
。
一般来说,您不应该依赖这两种行为,并且始终将 f 指定为最后一个选项,并在它和文件名之间放置一个空格。 (-b
仅在某些情况下写入物理磁带驱动器时才重要,因此在本讨论中可以忽略它。)