*。*符号叫什么?


Answers:


20

*.*旧版Windows / DOS系统下的解释

这里的意义与Windows / DOS相比,与Unix / Linux更相关。在旧的Windows / DOS系统上,这是一个“通配符”模式。通配符模式以类似于Unix glob的方式用于匹配文件名。该*.*通配符被普遍用来匹配任何文件。

与Unix glob一样,*会匹配文件名中的任何字符序列,因此*它本身也会匹配任何文件。但是,*.*也要匹配任何文件名的原因是由于这些通配符的工作方式不同。根据这篇文章

除星号后的点以外的任何字符均无效,因为星号将光标移动到位置12,在该点,除了清除最后三个位置并移动光标的点以外,其他任何状态都不会改变解析状态。

这种行为(从Unix角度来看有点奇怪)意味着a后面的点*实际上不与点匹配,而只是允许您向模式中添加更多字符的一种怪异的方式。这意味着添加另一个*将匹配最后三个位置中的任何内容。

当您考虑该语法在Windows 95之前的DOS和旧Windows系统上使用,而该文件需要8.3文件名时,这会更有意义。这些文件名只能有一个点,并在点后最多三个字符。大多数情况下,即使不是系统上的所有文件都具有三个字符的扩展名(即使从技术上来说,也允许使用较短的扩展名或不允许扩展名),所以以某种方式我认为使用它*.*来匹配任何文件都是有意义的(至少从扭曲的Windowsey逻辑角度来看) )。

*.*Unix shell中的解释

正如其他人指出的那样,在Unix shell中,这表示“路径名扩展”或“ glob”。在*没有任何奇怪的跳跃到最后的行为,因此不会导致以下它被忽略的字符。*.*模式将匹配任何包含点的文件名(开头除外)。绝对不会与任何文件匹配,因为Unix / Linux系统上有许多没有扩展名的文件(或者也包含点,因为也允许这样做)。

*.*在Unix上,文件名开头不匹配点的原因是,默认情况下,“点”是文件的“隐藏”方式,而隐藏文件是从glob中排除的。为了在POSIX shell中匹配它们,需要在模式的开头显式地放置一个点。在bashdotglob外壳选项可以设置或GLOBIGNORE变量可以适当地进行设置,但这是另外一个问题!


1
应该注意的是,当前的Windows版本似乎表现得更加合理。特别是,“除星号后的点以外的其他任何字符均无效”;至少在Windows 7上通过模式在标准的“ 打开文件”对话框中过滤文件时*7.*,获取扩展名前最后一个字符为的所有文件7,并使用*sa*,获取文件名中包含子字符串的所有文件,sa依此类推。(因此,你引用的文章的题目是如何通配符的工作在MS-DOS(我自己加的)。)
OR映射

1
@ORMapper,更新了标题以反映这一点。此行为是在Windows 95之前的版本中的(答案是正确的,尽管标题令人误解)。
Graeme'4

11

glob在bash中,下面我从bash手册中引用:

bash-GNU Bourne-Again SHell

*

匹配任何字符串,包括空字符串。启用globstar shell选项并将*其用于路径名扩展上下文时,两个相邻*s的单个模式将匹配所有文件以及零个或多个目录和子目录。如果后跟一个/,则两个相邻的*s将仅匹配目录和子目录。

在这种情况下,请*.*匹配.名称中包含点的所有文件。

您可以在此处查看更多详细信息。


8

星号*glob外壳语言。引用Shell命令语言

星号('*')是一种模式,必须与任何字符串匹配,包括空字符串。

但是,.除非dotglob设置了shell选项,否则它与以开头的文件名不匹配。

当您使用时*.*,它会匹配以下任何内容:

  • 不以 .
  • 包含至少一个 .

您可能还需要参考手册中的“ 文件名扩展 ”。


6

来自Windows的很多人认为*.*所有文件都是如此。在Windows上是。在UNIX上,所有文件名中至少包含1个点。*就其本身而言,在Windows中可以正常工作(可以追溯到早期的DOS);但是旧的教科书出版了*.*,这似乎很难改掉。


4

*是外壳程序用来执行文件名扩展(也称为“ globbing” )的通配符。 *扩展为任何内容,包括任何内容(例如,*.*将匹配file.等)。另一个通用通配符是?,它匹配任何单个字符。

不要将这些通配符的功能与在正则表达式中使用相同的字符(例如与grep一起使用的字符)相混淆。


3

至少在DOS(当然还有后来的Windows)世界中,这就是点对点的星星。在DOS中,点.具有特殊的魔术含义,因为文件名是8个字符的基数(后来扩展了,但让我们继续学习吧)和3个字符的扩展名(定义了文件类型)。在Unix中,文件类型通常由文件的前两个字节(或其他魔术)定义,并且扩展名是信息性的,但意义不大。除了什么时候变得模糊不清。

因此,在Unix中没有特殊含义。星号是Unix shell中的“ globbing”字符,是任意数量字符(包括零)的通配符。?是另一个常见的通配符,与任何一个字符都完全匹配。

*.*匹配包含至少一个的任何文件名.。除了*a*或以外,没有其他特殊名称或任何含义*_*。并且*.?将匹配所有带点的文件,并在该点后仅一个字符。还有一些更复杂的扩展glob模式-请参见shell的手册页。

“ New Hacker's Dictionary”(旧MIT的“ Jargon File”的扩展)指出,“ star”是该*符号最常用的名称(其后为splat),我认为在实践中仍然是正确的,并且.绝对是“点”,因此,虽然它没有任何内在的特殊含义,但是它在Unix上仍被合理地称为star-dot-star。(它的用处不大。)


这听起来可能很奇怪,但感谢您提及“星点星”,这就是使此页面可谷歌搜索的原因!
2014年

3

这里实际上有2个符号,星号*和点.。壳通常仅将星号解释为任何字符,但在正则表达式中则表示贪婪的glob。在这种情况下,它将匹配任何不以点结尾或以点开头但包含至少一个的内容:

somefile.dot # match
.dot.between.words. # match
.onlydotatstart # don't match
onlydotatend. # match
.startandenddot. # don't match

1
你的onlydotatend.情况肯定是对的吗?
Graeme 2014年

@Graeme不。touch 'onlydotatend.' && echo *.*不会返回
Braiam

1
为我做!在bash和上dash。您正在使用什么外壳?
Graeme 2014年

@Graeme zsh,你是对的bash不会。
Braiam 2014年

我只是在香草zsh配置上尝试过,它也可以在这里使用。我不知道怎么onlydotatend.不能匹配,是否有配置选项可以做到?
Graeme'4
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.