You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:06:03