为什么有些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
或shellfor
循环来解决此问题。谢谢,我理解。在这种情况下,我只有一个问题:在实践中,有没有一种方法可以知道或预期哪种情况会发生?例如,是否有一种方法可以先验地知道这对scp
有效,但对tar
无效?您只需知道命令需要哪些参数。没有命令真正看到*
;在调用命令之前,模式将替换为它匹配的模式。从命令的角度来看,ls foo*
和ls foo.c foo.txt
之间没有区别,如果它们是当前目录中仅有的两个匹配文件。好的,我确实理解你的意思,我认为这是一个不。谢谢你,我现在接受答案。