bash glob 简介
glob是一种模式匹配规范,用于匹配文件名,内置在bash中。这里总结了glob的常见用法。
1 准备环境
mkdir -p /tmp/test && cd /tmp/test && touch a1 a1b a2 a2b b1 b2 c1 c2 d1 d2 x xy xyy xz xzz
。
2 匹配替换的时机
以命令 ls a*
为例,我们只写了一个参数 a*
,但是 ls
接收到4个参数 a1 a1b a2 a2b
。在bash调用 ls
命令之前,完成了glob的模式匹配和替换。可以对比 system("ls a*")
和 execv("/bin/ls", "/bin/ls", "a*")
前者可以正常工作,因为它用bash -c
执行,后者不可以,因为没有bash做参数的匹配替换。
3 基础通配
3.1 匹配任意字符
*
可以匹配任意多个任意字符
a*b
匹配a1b a2b
a*
匹配a1 a1b a2 a2b
d1*
匹配d1
/tmp/*/b*
匹配/tmp/test/b1 /tmp/test/b2
3.2 匹配一个字符
?
可以匹配任意一个字符
a?
匹配a1 a2
a??
匹配a1b a2b
3.3 匹配指定字符
[]
匹配 []
中指定的字符,和正则很像
[ab]1
匹配a1 b1
[a-c]1
匹配a1 b1 c1
[^a-d]?
匹配xy xz
3.4 匹配指定字符串
{}
匹配 {}
中指定的字符串
mkdir /tmp/{ef,ff,fg}
创建三个目录ef,ff,fg
4 扩展通配
扩展匹配需要显示打开 shopt -s extglob
,注意:这个必须在单独的行, shopt -s extglob && ls !("a1"|"a2")
无效。个人觉得除了反向匹配,其它的用处不是特别大。因为不常用,建议用完之后关闭 shopt -u extglob
4.1 模式最多匹配一次
?(pattern-list)
模式最多匹配一次, x?(y|z)
匹配到 x xy xz
4.2 模式匹配任意次
*(pattern-list)
模式匹配任意次, x*(y|z)
匹配到 x xy xyy xz xzz
4.3 模式至少匹配一次
+(pattern-list)
模式至少匹配一次, x+(y|z)
匹配到 xy xyy xz xzz
4.4 模式仅匹配一次
@(pattern-list)
模式仅匹配一次, x@(y|zz)
匹配到 xy xzz
等价于 x{y,zz}
4.5 反向匹配
!(pattern-list)
反向匹配, ls x!(y|z)
匹配到 x xyy xzz
。一个实用例子,列出所有非 .conf
结尾的文件, !(*.conf)