Bash中*通配符的匹配规则及扩展问题咨询
Bash 中 * 通配符的扩展规则
Bash 的 * 通配符是路径名扩展(globbing)的核心工具,以下是它的核心扩展规则及针对你问题的具体分析:
基础规则
*匹配任意长度的任意字符序列(包括0个字符),默认情况下不会匹配以.开头的隐藏文件(若需匹配隐藏文件,可开启dotglobshell 选项)。- 通配符的匹配是对整个文件名/路径段的完全匹配,模式中的每一部分都要对应文件名的对应位置:
- 模式开头的固定字符必须匹配文件名的开头;
- 模式结尾的固定字符必须匹配文件名的结尾;
- 中间的
*可填充任意字符(包括空),用来连接前后的固定字符。
针对你示例的分析
1. 模式 m*i*n*
这个模式要求文件名满足:
- 以
m开头; - 中间包含
i; i之后存在n;n之后可以有任意字符(包括空)。
所以像 min、main、mixin、min_test、m1i2n3 这类文件名都会被匹配。
2. 模式 m*i*n
这个模式的核心限制是文件名必须以 n 结尾,完整要求:
- 以
m开头; - 中间包含
i; - 最后必须以
n收尾。
因此只有 min、main、mixin 这类以 n 结尾的文件名会被匹配,而像 min_test、m1i2n3 这类结尾不是 n 的文件则无法匹配——这就是你执行该命令时未得到匹配结果的原因。
额外注意事项
- 如果模式未匹配到任何文件,Bash 默认会保留原模式不展开,比如执行
echo non_exist*时,若没有对应文件,会直接输出non_exist*。 - 通配符扩展是在 Bash 执行命令前完成的,
echo等命令接收的是已经展开后的文件名列表,而非原始模式。 - 若要将
*作为普通字符输出,需用引号包裹(单引号或双引号),比如echo "m*i*n"会直接输出字符串m*i*n,不会触发通配符扩展。
内容的提问来源于stack exchange,提问作者user16715270
相关产品推荐
相关产品推荐

