ksh环境下如何匹配带数字与不带数字的文件?ls命令匹配问题
在ksh中匹配file.txt和file[数字].txt类文件的解决方案
这是个很常见的通配符匹配误区,我来帮你理清楚问题所在并给出可行的解决方法~
为什么原命令只匹配到file123.txt?
你使用的ls -l file[0-9]*.txt里,[0-9]是必须匹配至少一个0-9的数字字符,后面的*才代表匹配0个或多个任意字符。而file.txt的文件名里没有数字部分,完全不符合这个模式,所以自然不会被列出来。
解决方法
方法1:同时指定两个匹配模式(最直接)
你可以直接把两个需要匹配的模式用空格分隔,或者用ksh支持的大括号展开来简化写法:
# 方式1:空格分隔两个明确的模式 ls -l file.txt file[0-9]*.txt # 方式2:大括号展开,更简洁 ls -l file{,[0-9]*}.txt
大括号{,[0-9]*}会被shell展开成空字符串和[0-9]*,最终等价于同时匹配file.txt和file[0-9]*.txt两个模式,刚好覆盖你需要的两类文件。
方法2:使用ksh的扩展通配符(单模式匹配)
ksh支持扩展通配符(extglob)功能,开启后可以用更灵活的模式匹配规则:
- 先在当前shell会话中开启extglob:
set -o extglob
- 然后使用扩展模式匹配:
# 匹配file.txt 或 带数字的fileXXX.txt ls -l file@(.txt|[0-9]*.txt) # 另一种等价写法,逻辑更清晰 ls -l file@(|[0-9]*).txt
这里的@(pattern1|pattern2)是扩展通配符的语法,表示匹配其中任意一个模式:
- 左边的
|对应空字符串,即file+空+.txt就是file.txt - 右边是
[0-9]*,对应带数字后缀的文件
如果想让extglob永久生效,可以把set -o extglob添加到你的~/.kshrc或~/.profile配置文件中。
内容的提问来源于stack exchange,提问作者Adriana
相关产品推荐
相关产品推荐

