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

为什么呢,比如说,

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 

只有tar-f选项需要一个参数来指定要处理的文件。 如果使用glob表达式,则必须使用tar -xzvf并且有多个文件会因此而扩展,第一个文件之后的文件将被视为tar常规参数,而不是-f的选项参数。

由于您使用的是-x ,因此tar处于提取模式,并且正在将其他文件作为要从其运行的归档中提取的文件的名称。

*没有被引用时,任何包含它的单词都被视为一个shell模式,该模式将扩展为匹配该模式的文件名列表。

在第一个例子中,模式展开为现有文件列表,然后完成显示。

在第二个示例中,该模式再次展开为匹配文件的列表。 但是,只有该列表的第一个成员被视为f选项的参数。 其余的项目是你想从第一个文件中提取的文件的名称,这不是你想要的。

一般规则是该模式只是提供一个文件名列表; 这取决于您确保生成的文件列表是正在运行的命令的一组正确的参数。

“*”实际上是由shell扩展的,所得到的文件名列表将作为参数呈现给所讨论的命令。

“ls”命令支持文件名列表,“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 

给你的错误,因为后两个档案不能从第一个提取。