为什么有些linux命令会与"*&引用;在文件列表中,但其他文件没有?

为什么有些linux命令会与"*&引用;在文件列表中,但其他文件没有?,linux,glob,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 tar的-f选项只需要一个参数来指定要处理的文件。如果必须使用glob表达式tar-xzvf,并且有多个文件

比如为什么,

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的签名是:

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

由于后两个归档文件无法从第一个归档文件中提取,因此给您错误信息。

由于全局绑定是由shell完成的,因此在启动程序之前。FWIW,您可以使用
xargs
或shell
for
循环来解决此问题。谢谢,我理解。在这种情况下,我只有一个问题:在实践中,有没有一种方法可以知道或预期哪种情况会发生?例如,是否有一种方法可以先验地知道这对
scp
有效,但对
tar
无效?您只需知道命令需要哪些参数。没有命令真正看到
*
;在调用命令之前,模式将替换为它匹配的模式。从命令的角度来看,
ls foo*
ls foo.c foo.txt
之间没有区别,如果它们是当前目录中仅有的两个匹配文件。好的,我确实理解你的意思,我认为这是一个不。谢谢你,我现在接受答案。