### 10.1 Wildcard Matching ¶

This section describes how to match a wildcard pattern against a particular string. The result is a yes or no answer: does the string fit the pattern or not. The symbols described here are all declared in `fnmatch.h`.

Function: `int` fnmatch `(const char *pattern, const char *string, int flags)` ¶

  Preliminary: | MT-Safe env locale | AS-Unsafe heap | AC-Unsafe mem | See POSIX Safety Concepts.

  This function tests whether the string string matches the pattern pattern. It returns `0` if they do match; otherwise, it returns the nonzero value `FNM_NOMATCH`. The arguments pattern and string are both strings.

  The argument flags is a combination of flag bits that alter the details of matching. See below for a list of the defined flags.

  In the GNU C Library, `fnmatch` might sometimes report “errors” by returning nonzero values that are not equal to `FNM_NOMATCH`.

These are the available flags for the flags argument:

`FNM_FILE_NAME` ¶

  Treat the ‘`/`’ character specially, for matching file names. If this flag is set, wildcard constructs in pattern cannot match ‘`/`’ in string. Thus, the only way to match ‘`/`’ is with an explicit ‘`/`’ in pattern.

`FNM_PATHNAME` ¶

  This is an alias for `FNM_FILE_NAME`; it comes from POSIX.2. We don’t recommend this name because we don’t use the term “pathname” for file names.

`FNM_PERIOD` ¶

  Treat the ‘`.`’ character specially if it appears at the beginning of string. If this flag is set, wildcard constructs in pattern cannot match ‘`.`’ as the first character of string.

  If you set both `FNM_PERIOD` and `FNM_FILE_NAME`, then the special treatment applies to ‘`.`’ following ‘`/`’ as well as to ‘`.`’ at the beginning of string. (The shell uses the `FNM_PERIOD` and `FNM_FILE_NAME` flags together for matching file names.)

`FNM_NOESCAPE` ¶

  Don’t treat the ‘`\`’ character specially in patterns. Normally, ‘`\`’ quotes the following character, turning off its special meaning (if any) so that it matches only itself. When quoting is enabled, the pattern ‘`\?`’ matches only the string ‘`?`’, because the question mark in the pattern acts like an ordinary character.

  If you use `FNM_NOESCAPE`, then ‘`\`’ is an ordinary character.

`FNM_LEADING_DIR` ¶

  Ignore a trailing sequence of characters starting with a ‘`/`’ in string; that is to say, test whether string starts with a directory name that pattern matches.

  If this flag is set, either ‘`foo*`’ or ‘`foobar`’ as a pattern would match the string ‘`foobar/frobozz`’.

`FNM_CASEFOLD` ¶

  Ignore case in comparing string to pattern.

  This macro was originally a GNU extension, but was added in POSIX.1-2024.

`FNM_EXTMATCH` ¶

  Besides the normal patterns, also recognize the extended patterns introduced in `ksh`. The patterns are written in the form explained in the following table where pattern-list is a `|` separated list of patterns.

  `?(pattern-list)`

    The pattern matches if zero or one occurrences of any of the patterns in the pattern-list allow matching the input string.

  `*(pattern-list)`

    The pattern matches if zero or more occurrences of any of the patterns in the pattern-list allow matching the input string.

  `+(pattern-list)`

    The pattern matches if one or more occurrences of any of the patterns in the pattern-list allow matching the input string.

  `@(pattern-list)`

    The pattern matches if exactly one occurrence of any of the patterns in the pattern-list allows matching the input string.

  `!(pattern-list)`

    The pattern matches if the input string cannot be matched with any of the patterns in the pattern-list.