为什么,例如,
ls -1 /path/to/something/data*data/file*.txt
工作正常,而以下内容会返回错误:
tar -xzvf *tar.gz
tar: evsClient-v.0.0.6.tar.gz: Not found in archive
tar: evsClient-v.0.0.7.tar.gz: Not found in archive
答案 0 :(得分:3)
-f
的{{1}}选项只需要一个参数来指定要处理的文件。如果你必须使用glob表达式tar
并且有多个文件因此而被展开,那么第一个之后的文件将成为tar -xzvf
的常规参数,而不是选项参数tar
。
由于您使用的是-f
,-x
处于提取模式,并且它将其他文件作为要从其运行的存档中提取的文件的名称。
答案 1 :(得分:2)
如果未引用*
,则将包含它的任何单词视为shell模式,该模式将扩展为与该模式匹配的文件名列表。
在第一个示例中,模式会扩展为现有文件列表,ls
然后尽职尽责地显示。
在第二个示例中,模式再次扩展为匹配文件列表。但是,只有该列表的第一个成员被视为f
选项的参数。其余项目是您要从第一个文件中提取的文件的名称,这不是您的意图。
一般规则是模式只提供文件名列表;由您来确保生成的文件列表是您正在运行的命令的正确参数集。
答案 2 :(得分:1)
" *"实际上是由shell扩展,然后生成的文件名列表作为相关命令的参数。
" ls"命令支持文件名列表," tar"命令。但tar的签名是:
tar option(s) archive_name file_name(s)
所以 - 在你的例子中,我假设命令行扩展为:
tar -xzvf evsClient-v.0.0.5.tar.gz evsClient-v.0.0.6.tar.gz evsClient-v.0.0.7.tar.gz
给你错误,因为无法从第一个档案中提取后两个档案。