Inspire - Capo Productions
模式匹配
用于匹配目录、文件,而不是字符串,类似与正则表达式,但他们有不同的语法、用途。例如,列出目录 src 下的所有目录、文件:
shell
li src/**1 语法
glob 默认不匹配隐藏文件(以点.开头的文件或目录)
1.1 基础语法
| 通配符 | 描述 | 示例 | 匹配 | 不匹配 |
|---|---|---|---|---|
* | 匹配0个或多个字符,包含空串 | Law* | Law, Laws和Lawer | La, aw |
? | 匹配1个字符 | ?at | cat, bat | at |
[abc] | 匹配括号内字符集合中的单个字符 | [cb]at | cat, bat | at, bcat |
[a-z] | 匹配括号内字符范围中的单个字符 | [a-z]at | aat, bat, zat | at, bcat, Bat |
[^abc]或[!abc] | 匹配非括号内字符集合中的单个字符 | [!CB]at | cat, bat | Cat, Bat |
[^a-z]或[!a-z] | 匹配非括号内字符范围中的单个字符 | [!A-Z]at | aat, bat, zat | Aat, Bat, Zat |
在 bash 命令行中[!abc]需要转义成[!abc]
1.2 扩展语法
主要包含三种:
- Brace Expansion
- globstar
- extglob
| 通配符 | 描述 | 示例 | 匹配 | 不匹配 |
|---|---|---|---|---|
{x, y, ...} | Brace Expansion,展开花括号内容,支持展开嵌套括号 | a.{png,jp{,e}g} | a.png, a.jpg, a.jpeg | |
** | globstar,匹配所有文件和任意层目录,如果**后面紧接着/则只匹配目录,不含隐藏目录 | src/** | src/a.js, src/b/a.js, src/b/ | src/.hide/a.js |
?(pattern-list) | 匹配0次或1次给定的模式 | `a.?(txt | bin)` | a., a.txt, a.bin |
*(pattern-list) | 匹配0次或多次给定的模式 | `a.*(txt | bin)` | a., a.txt, a.bin, a.txtbin |
+(pattern-list) | 匹配1次或多次给定的模式 | `a.+(txt | bin)` | a.txt, a.bin, a.txtbin |
@(pattern-list) | 匹配给定的模式 | `a.@(txt | bin)` | a.txt, a.bin |
!(pattern-list) | 匹配非给定的模式 | `a.!(txt | bin)` | a., a.txtbin |
pattern-list 是一组以|作为分隔符的模式集合,例如abc|a?c|ac*
2 与正则表达式的差异
*、? 在正则表达式中是量词,表示匹配的字符或表达式的数量,与其前一个表达式组合使用。在glob 中表示字符,可以单独使用。
| 通配符 | glob | 正则表达式 |
|---|---|---|
| * | 匹配0个或多个字符 | 匹配前一个表达式 0 次或多次。等价于 |
| ? | 匹配1个字符 | 匹配前面一个表达式 0 次或者 1 次。等价于 |