---
name: "fnmatch"
section: "3"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd", "macos"]
url: "https://new.carta.tech/fnmatch"
---

# fnmatch(3)

match filename or pathname

## NAME

fnmatch - match filename or pathname

## LIBRARY

Standard C library (*libc*, *-lc*)

## SYNOPSIS

```
#include <fnmatch.h>
```

**int fnmatch(const char \****pattern***, const char \****string***, int** *flags***);**

## DESCRIPTION

The **fnmatch**() function checks whether the *string* argument matches the *pattern* argument, which is a shell wildcard pattern (see [**glob**(7)](/glob/7.md)).

The *flags* argument modifies the behavior; it is the bitwise OR of zero or more of the following flags:

- **FNM\_NOESCAPE**

  If this flag is set, treat backslash as an ordinary character, instead of an escape character.

- **FNM\_PATHNAME**

  If this flag is set, match a slash in *string* only with a slash in *pattern* and not by an asterisk (\*) or a question mark (?) metacharacter, nor by a bracket expression (\[\]) containing a slash.

- **FNM\_PERIOD**

  If this flag is set, a leading period in *string* has to be matched exactly by a period in *pattern*. A period is considered to be leading if it is the first character in *string*, or if both **FNM\_PATHNAME** is set and the period immediately follows a slash.

- **FNM\_FILE\_NAME**

  This is a GNU synonym for **FNM\_PATHNAME**.

- **FNM\_LEADING\_DIR**

  If this flag (a GNU extension) is set, the pattern is considered to be matched if it matches an initial segment of *string* which is followed by a slash. This flag is mainly for the internal use of glibc and is implemented only in certain cases.

- **FNM\_CASEFOLD** **FNM\_IGNORECASE** (same as **FNM\_CASEFOLD**)

  If this flag is set, the pattern is matched case-insensitively.

- **FNM\_EXTMATCH**

  If this flag (a GNU extension) is set, extended patterns are supported, as introduced by 'ksh' and now supported by other shells. The extended format is as follows, with *pattern-list* being a '\|' separated list of patterns.

- '?(*pattern-list*)'

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

- '\*(*pattern-list*)'

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

- '+(*pattern-list*)'

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

- '@(*pattern-list*)'

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

- '!(*pattern-list*)'

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

## RETURN VALUE

Zero if *string* matches *pattern*, **FNM\_NOMATCH** if there is no match or another nonzero value if there is an error.

## ATTRIBUTES

For an explanation of the terms used in this section, see [**attributes**(7)](/attributes/7.md).

| | | |
| --- | --- | --- |
| **Interface** | **Attribute** | **Value** |
| **fnmatch**() | Thread safety | MT-Safe env locale |

## STANDARDS

- **fnmatch**()

  POSIX.1-2008.

- **FNM\_CASEFOLD** **FNM\_IGNORECASE**

  POSIX.1-2024.

- **FNM\_FILE\_NAME** **FNM\_LEADING\_DIR**

  GNU.

## HISTORY

- **fnmatch**()

  POSIX.1-2001, POSIX.2.

- **FNM\_CASEFOLD**

  has been available on many systems even before POSIX.1-2024.

## SEE ALSO

[**sh**(1)](/sh/1.md), [**glob**(3)](/glob/3.md), [**scandir**(3)](/scandir/3.md), [**wordexp**(3)](/wordexp/3.md), [**glob**(7)](/glob/7.md)
