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

如何使用ls命令按文件名的数字范围精准匹配目标文件?

如何使用ls命令按文件名的数字范围精准匹配目标文件?

嗨,我来帮你理清这个问题~你之前用ls -l [40-50]*没得到预期结果,是因为shell的方括号通配符不是按数字范围来解析的!

为什么原来的命令不对?

[40-50]在shell通配符里的意思是:匹配单个字符属于以下集合中的任意一个:4、0到5的数字(0、1、2、3、4、5)、0。简单说就是只要文件名的第一个字符是1、2、3、4、5,都会被匹配到——这就是为什么你会看到10、20这些开头的文件也被列出来了。

几个可行的解决方法:

方法1:用bash扩展通配符(推荐,直接简洁)

如果你的shell是bash,可以利用它的extglob扩展功能来精准匹配范围:

# 匹配40-49或50开头的所有文件
ls -l @(4[0-9]|50)*

解释一下:

  • @(pattern1|pattern2)是扩展通配符的语法,表示匹配pattern1或者pattern2中的任意一个
  • 4[0-9]会匹配40到49开头的文件,50专门匹配50开头的文件,合起来就覆盖了你要的40-50范围

如果你的bash没开启extglob,可以先执行shopt -s extglob开启,之后就能用这个语法了。

方法2:结合ls和grep过滤

如果不想折腾shell扩展,用grep配合正则表达式过滤文件名也很方便:

# 先列出所有文件,筛选出符合开头范围的,再显示详细信息
ls | grep -E '^(4[0-9]|50)' | xargs ls -l

解释:

  • grep -E启用扩展正则,^(4[0-9]|50)表示匹配以40-49或50开头的文件名
  • xargs把筛选出的文件名传给ls -l,这样就能看到详细列表了

方法3:用find命令(更通用,适合复杂场景)

如果需要更灵活的查找(比如递归找子目录),find命令是更好的选择:

# 仅在当前目录查找符合条件的文件,显示详细信息
find . -maxdepth 1 -type f -regextype posix-extended -regex './(4[0-9]|50).*' -ls

解释:

  • -maxdepth 1限制只查找当前目录(去掉的话会递归子目录)
  • -type f只找普通文件(排除目录等)
  • -regex用正则匹配文件路径(注意路径是./文件名,所以正则开头是./)
  • -ls输出和ls -l类似的详细信息

总结

如果只是当前目录简单匹配,bash扩展通配符的方法最直接;如果需要跨shell或者更复杂的过滤,grep或find的方法更通用。

备注:内容来源于stack exchange,提问作者snydez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:39:32