File path glob-like matching.
A library for matching files using patterns such as "src/**/*.png"
for all .png
files recursively under the src
directory. Features:
All matching is O(n). Most functions precompute some information given only one argument.
See
System.FilePattern
and?==
simple matching and semantics.Use
match
andsubstitute
to extract suitable strings from the*
and**
matches, and substitute them back into other patterns.Use
step
andmatchMany
to perform bulk matching of many patterns against many paths simultaneously.Use
System.FilePattern.Directory
to perform optimised directory traverals using patterns.
Originally taken from the Shake library.
FilePattern
A library for matching files using patterns such as src/**/*.png
for all .png
files recursively under the src
directory. There are two special forms:
*
matches part of a path component, excluding any separators.**
as a path component matches an arbitrary number of path components.
Some examples:
test.c
matchestest.c
and nothing else.*.c
matches all.c
files in the current directory, sofile.c
matches, butfile.h
anddir/file.c
don't.**/*.c
matches all.c
files anywhere on the filesystem, sofile.c
,dir/file.c
,dir1/dir2/file.c
and/path/to/file.c
all match, butfile.h
anddir/file.h
don't.dir/*/*
matches all files one level belowdir
, sodir/one/file.c
anddir/two/file.h
match, butfile.c
,one/dir/file.c
,dir/file.h
anddir/one/two/file.c
don't.
More complete semantics are given in the documentation for the matching function ?==
.
Features
- All matching is O(n). Most functions precompute some information given only one argument. There are also functions to provide bulk matching of many patterns against many paths simultaneously, see
step
andmatchMany
. - You can obtain the parts that matched the
*
and**
special forms usingmatch
, and substitute them into other patterns usingsubstitute
. - You can search for files using a minimal number of IO operations, using the System.FilePattern.Directory module.
Related work
- Another Haskell file pattern matching library is Glob, which aims to be closer to the POSIX
glob()
function, with forms such as*
,?
,**/
(somewhat different to thefilepattern
equivalent) and[:alpha:]
. A complete guide is in the documentation. Compared tofilepattern
, theGlob
library is closer to a regular expression library - definitely more powerful, potentially harder to use. - The
shake
library has contained aFilePattern
type since the beginning. This library evolved from that code, with significant improvements. - The semantics are heavily inspired by VS Code, Git and the NPM package Glob.