扩展的通配

Version >= 2.02

制备

$ mkdir globbing
$ cd globbing
$ mkdir -p folder/{sub,another}folder/content/deepfolder/
touch macy stacy tracy "file with space" folder/{sub,another}folder/content/deepfolder/file .hiddenfile
$ shopt -u nullglob
$ shopt -u failglob
$ shopt -u dotglob
$ shopt -u nocaseglob
$ shopt -u extglob
$ shopt -u globstar

Bash 的内置 extglob 选项可以扩展 glob 的匹配功能

shopt -s extglob

以下子模式包含有效的扩展 glob:

  • ?(pattern-list) - 匹配给定模式的零次或一次
  • *(pattern-list) - 匹配给定模式的零次或多次出现
  • +(pattern-list) - 匹配给定模式的一个或多个实例
  • @(pattern-list) - 匹配给定模式之一
  • !(pattern-list) - 匹配除给定模式之外的任何内容

pattern-list 是由|分隔的球体列表。

$ echo *([r-t])acy
stacy tracy

$ echo *([r-t]|m)acy
macy stacy tracy

$ echo ?([a-z])acy
macy

pattern-list 本身可以是另一个嵌套的扩展 glob。在上面的例子中,我们看到我们可以将 tracystacy*(r-t) 相匹配。这个扩展的 glob 本身可以在否定的扩展 glob !(pattern-list) 中使用,以匹配 macy

$ echo !(*([r-t]))acy
macy

它匹配任何东西,它不能与零个或多个 rst,只留下 macy 尽可能匹配的字母开始。