Linux shell下如何用ls列出至少含2个元音且后缀为.c/.h/.s的文件
问题解决方案
你需要的至少匹配2个元音的ls命令可以直接用以下通配符写法:
ls *[aeiou]*[aeiou]*.[chs]
原写法问题说明
你最初写的ls *{a,e,i,o,u}*.[chs]使用了bash的花括号扩展,最终会展开为ls *a*.[chs] *e*.[chs] *i*.[chs] *o*.[chs] *u*.[chs],只要文件名包含任意1个元音就会被匹配,自然无法满足至少2个元音的要求。
方案说明
1. 原生通配符方案(推荐)
上述给出的*[aeiou]*[aeiou]*.[chs]是标准glob通配符写法:
- 前后的
*匹配任意长度的任意字符 - 两处
[aeiou]要求文件名中至少出现2个元音字母(a/e/i/o/u) - 末尾的
.[chs]限定后缀为.c/.h/.s
如果需要同时匹配大写元音字母(A/E/I/O/U),可以修改字符集:
ls *[aeiouAEIOU]*[aeiouAEIOU]*.[chs]
如果你希望不区分大小写匹配,也可以先开启bash的nocaseglob选项:
# 开启不区分大小写匹配 shopt -s nocaseglob # 执行匹配 ls *[aeiou]*[aeiou]*.[chs] # 用完可以关闭该选项 shopt -u nocaseglob
2. 结合grep正则方案
如果你更习惯用正则表达式做匹配,可以组合ls和grep实现:
# 区分大小写匹配 ls | grep -E '.*[aeiou].*[aeiou].*\.[chs]$' # 不区分大小写匹配 ls | grep -iE '.*[aeiou].*[aeiou].*\.[chs]$'
3. 适配特殊文件名的find方案
如果你的文件名包含空格、换行等特殊字符,用find命令更稳妥:
# 仅匹配当前目录,不递归 find . -maxdepth 1 -type f -regex '.*[aeiou].*[aeiou].*\.[chs]' # 去掉-maxdepth 1参数可以递归匹配所有子目录
内容的提问来源于stack exchange,提问作者tux_transistor
相关产品推荐
相关产品推荐

