FNMATCH(7) Standards, Environments, and Macros FNMATCH(7)
NAME
fnmatch - file name pattern matching
DESCRIPTION
The pattern matching notation described below is used to specify
patterns for matching strings in the shell. Historically, pattern
matching notation is related to, but slightly different from, the
regular expression notation. For this reason, the description of the
rules for this pattern matching notation is based on the description
of regular expression notation described on the
regex(7) manual page.
Patterns Matching a Single Character
The following patterns match a single character:
ordinary characters,
special pattern characters and
pattern bracket expressions. The
pattern bracket expression will also match a single collating
element.
An ordinary character is a pattern that matches itself. It can be any
character in the supported character set except for
NUL, those
special shell characters that require quoting, and the following
three special pattern characters. Matching is based on the bit
pattern used for encoding the character, not on the graphic
representation of the character. If any character (ordinary, shell
special, or pattern special) is quoted, that pattern will match the
character itself. The shell special characters always require
quoting.
When unquoted and outside a bracket expression, the following three
characters will have special meaning in the specification of
patterns:
? A question-mark is a pattern that will match any character.
* An asterisk is a pattern that will match multiple characters,
as described in
Patterns Matching Multiple Characters, below.
[ The open bracket will introduce a pattern bracket expression.
The description of basic regular expression bracket expressions on
the
regex(7) manual page also applies to the pattern bracket
expression, except that the exclamation-mark character
( ! ) replaces
the circumflex character (
^) in its role in a
non-matching list in
the regular expression notation. A bracket expression starting with
an unquoted circumflex character produces unspecified results.
The restriction on a circumflex in a bracket expression is to allow
implementations that support pattern matching using the circumflex as
the negation character in addition to the exclamation-mark. A
portable application must use something like
[\^!] to match either
character.
When pattern matching is used where shell quote removal is not
performed (such as in the argument to the
find -name primary when
find is being called using one of the
exec functions, or in the
pattern argument to the
fnmatch(3C) function, special characters can
be escaped to remove their special meaning by preceding them with a
backslash character. This escaping backslash will be discarded. The
sequence
\\ represents one literal backslash. All of the requirements
and effects of quoting on ordinary, shell special and special pattern
characters will apply to escaping in this context.
Both quoting and escaping are described here because pattern matching
must work in three separate circumstances:
o Calling directly upon the shell, such as in pathname
expansion or in a
case statement. All of the following
will match the string or file
abc:
abc "abc" a"b"c a\bc a[b]c a["b"]c a[\b]c a["\b"]c a?c a*c The following will not:
"a?c" a\*c a\[b]c o Calling a utility or function without going through a
shell, as described for
find(1) and the function
fnmatch(3C) o Calling utilities such as
find,
cpio,
tar or
pax through
the shell command line. In this case, shell quote removal
is performed before the utility sees the argument. For
example, in:
find /bin -name e\c[\h]o -print
after quote removal, the backslashes are presented to
find and it treats them as escape characters. Both precede
ordinary characters, so the
c and
h represent themselves
and
echo would be found on many historical systems (that
have it in
/bin). To find a file name that contained shell
special characters or pattern characters, both quoting and
escaping are required, such as:
pax -r ... "*a\(\?" to extract a filename ending with
a(?.
Conforming applications are required to quote or escape the shell
special characters (sometimes called metacharacters). If used without
this protection, syntax errors can result or implementation
extensions can be triggered. For example, the KornShell supports a
series of extensions based on parentheses in patterns; see
ksh(1) Patterns Matching Multiple Characters
The following rules are used to construct
patterns matching multiple characters from
patterns matching a single character:
o The asterisk (*) is a pattern that will match any string,
including the null string.
o The concatenation of
patterns matching a single character is a valid pattern that will match the concatenation of
the single characters or collating elements matched by
each of the concatenated patterns.
o The concatenation of one or more
patterns matching a single character with one or more asterisks is a valid
pattern. In such patterns, each asterisk will match a
string of zero or more characters, matching the greatest
possible number of characters that still allows the
remainder of the pattern to match the string.
Since each asterisk matches zero or more occurrences, the patterns
a*b and
a**b have identical functionality.
Examples:
a[bc] matches the strings
ab and
ac.
a*d matches the strings
ad,
abd and
abcd, but not the string
abc.
a*d* matches the strings
ad,
abcd,
abcdef,
aaaad and
adddd.
*a*d matches the strings
ad,
abcd,
efabcd,
aaaad and
adddd.
Patterns Used for Filename Expansion
The rules described so far in
Patterns Matching Multiple Characters and
Patterns Matching a Single Character are qualified by the
following rules that apply when pattern matching notation is used for
filename expansion.
1. The slash character in a pathname must be explicitly
matched by using one or more slashes in the pattern; it
cannot be matched by the asterisk or question-mark special
characters or by a bracket expression. Slashes in the
pattern are identified before bracket expressions; thus, a
slash cannot be included in a pattern bracket expression
used for filename expansion. For example, the pattern
a[b/c]d will not match such pathnames as
abd or
a/d. It
will only match a pathname of literally
a[b/c]d.
2. If a filename begins with a period (.), the period must be
explicitly matched by using a period as the first
character of the pattern or immediately following a slash
character. The leading period will not be matched by:
+o the asterisk or question-mark special characters
+o a bracket expression containing a non-matching list,
such as:
[!a] a range expression, such as:
[%-0] or a character class expression, such as:
[[:punct:]] It is unspecified whether an explicit period in a bracket
expression matching list, such as:
[.abc] can match a leading period in a filename.
3. Specified patterns are matched against existing filenames
and pathnames, as appropriate. Each component that
contains a pattern character requires read permission in
the directory containing that component. Any component,
except the last, that does not contain a pattern character
requires search permission. For example, given the
pattern:
/foo/bar/x*/bam search permission is needed for directories
/ and
foo,
search and read permissions are needed for directory
bar,
and search permission is needed for each
x* directory.
If the pattern matches any existing filenames or
pathnames, the pattern will be replaced with those
filenames and pathnames, sorted according to the collating
sequence in effect in the current locale. If the pattern
contains an invalid bracket expression or does not match
any existing filenames or pathnames, the pattern string is
left unchanged.
SEE ALSO
find(1),
ksh(1),
fnmatch(3C),
regex(7) June 14, 2015 FNMATCH(7)