为什么有些linux命令在文件列表中使用“*”但其他文件没有?

时间:2014-09-09 19:53:41

标签: linux glob

为什么,例如,

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

3 个答案:

答案 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

给你错误,因为无法从第一个档案中提取后两个档案。