如何筛选9位a-f/0-9字符文件名?适配ls、grep、find工具
匹配9位十六进制小写文件名的方法
你的需求是匹配长度为9、仅包含a-f小写字母和0-9数字的文件名,下面分别说明ls、grep、find的实现方式,以及规则的适配性:
1. 使用ls筛选
ls依赖shell通配符实现匹配,有两种简洁写法:
- 直接重复9次字符范围匹配:
ls [a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9] - 利用bash的大括号展开功能(默认开启),简化重复写法:
这条命令会被shell自动展开成9个ls [a-f0-9]{9}[a-f0-9]的形式,效果和上面完全一致。
2. 适配grep工具
grep使用正则表达式匹配,需要明确限定字符串的首尾(避免匹配更长/更短的包含目标片段的内容):
- 基础正则写法:
其中grep '^[a-f0-9]\{9\}$' 文件名列表^表示行首,$表示行尾,\{9\}指定前面的字符范围重复9次。 - 扩展正则写法(更简洁):
加grep -E '^[a-f0-9]{9}$' 文件名列表-E参数后可以用{9}代替\{9\},语法更直观。
3. 适配find工具
find有两种匹配方式,对应不同的规则:
方式一:用shell通配符(-name选项)
和ls的逻辑一致,直接用大括号展开或重复字符范围:
find . -maxdepth 1 -name '[a-f0-9]{9}'
-maxdepth 1限定只查找当前目录,避免递归子目录(按需去掉)。
方式二:用正则表达式(-regex选项)
find的正则默认是emacs风格,需要匹配完整路径(比如当前目录下的文件会显示为./xxx):
find . -maxdepth 1 -regex './[a-f0-9]\{9\}'
如果想使用扩展正则简化写法,可指定正则类型:
find . -maxdepth 1 -regextype posix-extended -regex './[a-f0-9]{9}'
规则适配说明
- ls和find的
-name选项用的是shell通配符,重复字符的写法依赖shell的大括号展开,和正则表达式语法不同; - grep和find的
-regex选项用的是正则表达式,重复次数用{n}(扩展正则)或\{n\}(基础正则),语法逻辑统一。
内容的提问来源于stack exchange,提问作者Renat
相关产品推荐
相关产品推荐

