Preparation
$ 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's built-in extglob
option can extend a glob's matching capabilities
shopt -s extglob
The following sub-patterns comprise valid extended globs:
?(pattern-list)
– Matches zero or one occurrence of the given patterns*(pattern-list)
– Matches zero or more occurrences of the given patterns+(pattern-list)
– Matches one or more occurrences of the given patterns@(pattern-list)
– Matches one of the given patterns!(pattern-list)
– Matches anything except one of the given patternsThe pattern-list
is a list of globs separated by |
.
$ echo *([r-t])acy
stacy tracy
$ echo *([r-t]|m)acy
macy stacy tracy
$ echo ?([a-z])acy
macy
The pattern-list
itself can be another, nested extended glob. In the above
example we have seen that we can match tracy
and stacy
with *(r-t)
.
This extended glob itself can be used inside the negated extended glob
!(pattern-list)
in order to match macy
$ echo !(*([r-t]))acy
macy
It matches anything that does not start with zero or more occurrences of the
letters r
, s
and t
, which leaves only macy
as possible match.