Linux Shell 通配符 / glob 模式

glob 模式(globbing)也被称之为 shell 通配符,名字的起源来自于 Unix V6 中的 /etc/glob (详见 man 文档)。glob 是一种特殊的模式匹配,最常见的是通配符拓展,也可以将 glob 模式设为精简了的正则表达式,在最新的 CentOS 7 中已经删除了 glob 的相关描述文档,删除的原因由于 glob 已经整合到了 shell 之中,然后就有了 shell 通配符。

笔者在查阅资料的时候发现关于 glob 模式或者 globbing 的相关描述以及文档是少之又少,所以特地在这里整理一下并重新写一写使用方法

shell 通配符 / glob 模式通常用来匹配目录以及文件,而不是文本!!!

语法 字符解释
*   匹配任意长度任意字符  
?   匹配任意单个字符  
[list]   匹配指定范围内(list)任意单个字符,也可以是单个字符组成的集合  
[^list]   匹配指定范围外的任意单个字符或字符集合  
[!list]   同[^list]  
{str1,str2,...}   匹配 srt1 或者 srt2 或者更多字符串,也可以是集合  

专用字符集

字符意义
[:alnum:]   任意数字或者字母  
[:alpha:]   任意字母  
[:space:]   空格  
[:lower:]   小写字母  
[:digit:]   任意数字  
[:upper:]   任意大写字母  
[:cntrl:]   控制符  
[:graph:]   图形  
[:print:]   可打印字符  
[:punct:]   标点符号  
[:xdigit:]   十六进制数  
[:blank:]   空白字符(未验证)  


在使用通配符的过程中可能会遇到文件名中包含了特殊字符的情况,例如

bash$:ls a\b a[123]b A[abc]123 abc!123 a 12 b #这是一个文件

在不使用专用字符集的情况下,需要使用转义符来匹配,或者使用单引号将其框选。

这里将 Linux shell 元字符列出,在使用通配符时如果没有进行转义可能就会被辨识为元字符

字符作用
IFS   由 < space > 或 < tab > 或 < enter > 三者之一组成  
CR   由 < enter > 产生  
=   设定变量  
$   作变量或运算替换  
>   重导向标准输出  
<   重导向标准输入  
\      
&   重导向文件描述符,或将命令静默执行  
( )   将其内的命令置于 nested subshell 执行,或用于运算或命令替换  
{ }   将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围  
;   在前一个命令结束时,而忽略其返回值,继续执行下一个命令  
&&   在前一个命令结束时,若返回值为 true,继续执行下一个命令  
\   \  
!   执行 history 中的命令  

第六行与倒数第二行居然错误了,看来博客园对 Markdown 的支持有待改进

第六行内容:“ | ”命令管线
倒数第二行内容:“ \ ” 在前一个命令结束时,若返回值为 false,继续执行下一个命令

示例

这里使用 /etc 下的文件为例

匹配以 a开头,中间包含任意数量数字的文件

ls a*[0-9]* #当然你是找不到的,因为通常情况下 /etc 下没有以数字开头的文件

匹配以任意小写字母开头,中间包含数字的文件

ls [[:lower:]]*[0-9]* #相信你已经看到了一些文件,我们继续

列出所有文件中以 init 开头,英文结尾的文件

ls init*[a-z]

列出以 au,b,c 开头的文件

ls {"au",[bc]}*

更多的实例可以通过搜索引擎找到,这里就不多说了

注意事项

在使用专属字符集的时候,字符集之外还需要用 [] 来包含住,否则专用字符集不会生效,例如 [[:space:]]

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/b10a406540acb3c8fe1dbe26e2c8a361.html