1# Glob
2
3Match files using the patterns the shell uses.
4
5The most correct and second fastest glob implementation in
6JavaScript. (See **Comparison to Other JavaScript Glob
7Implementations** at the bottom of this readme.)
8
9![a fun cartoon logo made of glob characters](https://github.com/isaacs/node-glob/raw/main/logo/glob.png)
10
11## Usage
12
13Install with npm
14
15```
16npm i glob
17```
18
19**Note** the npm package name is _not_ `node-glob` that's a
20different thing that was abandoned years ago. Just `glob`.
21
22```js
23// load using import
24import { glob, globSync, globStream, globStreamSync, Glob } from 'glob'
25// or using commonjs, that's fine, too
26const {
27  glob,
28  globSync,
29  globStream,
30  globStreamSync,
31  Glob,
32} = require('glob')
33
34// the main glob() and globSync() resolve/return array of filenames
35
36// all js files, but don't look in node_modules
37const jsfiles = await glob('**/*.js', { ignore: 'node_modules/**' })
38
39// pass in a signal to cancel the glob walk
40const stopAfter100ms = await glob('**/*.css', {
41  signal: AbortSignal.timeout(100),
42})
43
44// multiple patterns supported as well
45const images = await glob(['css/*.{png,jpeg}', 'public/*.{png,jpeg}'])
46
47// but of course you can do that with the glob pattern also
48// the sync function is the same, just returns a string[] instead
49// of Promise<string[]>
50const imagesAlt = globSync('{css,public}/*.{png,jpeg}')
51
52// you can also stream them, this is a Minipass stream
53const filesStream = globStream(['**/*.dat', 'logs/**/*.log'])
54
55// construct a Glob object if you wanna do it that way, which
56// allows for much faster walks if you have to look in the same
57// folder multiple times.
58const g = new Glob('**/foo', {})
59// glob objects are async iterators, can also do globIterate() or
60// g.iterate(), same deal
61for await (const file of g) {
62  console.log('found a foo file:', file)
63}
64// pass a glob as the glob options to reuse its settings and caches
65const g2 = new Glob('**/bar', g)
66// sync iteration works as well
67for (const file of g2) {
68  console.log('found a bar file:', file)
69}
70
71// you can also pass withFileTypes: true to get Path objects
72// these are like a Dirent, but with some more added powers
73// check out http://npm.im/path-scurry for more info on their API
74const g3 = new Glob('**/baz/**', { withFileTypes: true })
75g3.stream().on('data', path => {
76  console.log(
77    'got a path object',
78    path.fullpath(),
79    path.isDirectory(),
80    path.readdirSync().map(e => e.name)
81  )
82})
83
84// if you use stat:true and withFileTypes, you can sort results
85// by things like modified time, filter by permission mode, etc.
86// All Stats fields will be available in that case. Slightly
87// slower, though.
88// For example:
89const results = await glob('**', { stat: true, withFileTypes: true })
90
91const timeSortedFiles = results
92  .sort((a, b) => a.mtimeMs - b.mtimeMs)
93  .map(path => path.fullpath())
94
95const groupReadableFiles = results
96  .filter(path => path.mode & 0o040)
97  .map(path => path.fullpath())
98
99// custom ignores can be done like this, for example by saying
100// you'll ignore all markdown files, and all folders named 'docs'
101const customIgnoreResults = await glob('**', {
102  ignore: {
103    ignored: p => /\.md$/.test(p.name),
104    childrenIgnored: p => p.isNamed('docs'),
105  },
106})
107
108// another fun use case, only return files with the same name as
109// their parent folder, plus either `.ts` or `.js`
110const folderNamedModules = await glob('**/*.{ts,js}', {
111  ignore: {
112    ignored: p => {
113      const pp = p.parent
114      return !(p.isNamed(pp.name + '.ts') || p.isNamed(pp.name + '.js'))
115    },
116  },
117})
118
119// find all files edited in the last hour, to do this, we ignore
120// all of them that are more than an hour old
121const newFiles = await glob('**', {
122  // need stat so we have mtime
123  stat: true,
124  // only want the files, not the dirs
125  nodir: true,
126  ignore: {
127    ignored: p => {
128      return new Date() - p.mtime > 60 * 60 * 1000
129    },
130    // could add similar childrenIgnored here as well, but
131    // directory mtime is inconsistent across platforms, so
132    // probably better not to, unless you know the system
133    // tracks this reliably.
134  },
135})
136```
137
138**Note** Glob patterns should always use `/` as a path separator,
139even on Windows systems, as `\` is used to escape glob
140characters. If you wish to use `\` as a path separator _instead
141of_ using it as an escape character on Windows platforms, you may
142set `windowsPathsNoEscape:true` in the options. In this mode,
143special glob characters cannot be escaped, making it impossible
144to match a literal `*` `?` and so on in filenames.
145
146## Command Line Interface
147
148```
149$ glob -h
150
151Usage:
152  glob [options] [<pattern> [<pattern> ...]]
153
154Expand the positional glob expression arguments into any matching file system
155paths found.
156
157  -c<command> --cmd=<command>
158                         Run the command provided, passing the glob expression
159                         matches as arguments.
160
161  -A --all               By default, the glob cli command will not expand any
162                         arguments that are an exact match to a file on disk.
163
164                         This prevents double-expanding, in case the shell
165                         expands an argument whose filename is a glob
166                         expression.
167
168                         For example, if 'app/*.ts' would match 'app/[id].ts',
169                         then on Windows powershell or cmd.exe, 'glob app/*.ts'
170                         will expand to 'app/[id].ts', as expected. However, in
171                         posix shells such as bash or zsh, the shell will first
172                         expand 'app/*.ts' to a list of filenames. Then glob
173                         will look for a file matching 'app/[id].ts' (ie,
174                         'app/i.ts' or 'app/d.ts'), which is unexpected.
175
176                         Setting '--all' prevents this behavior, causing glob to
177                         treat ALL patterns as glob expressions to be expanded,
178                         even if they are an exact match to a file on disk.
179
180                         When setting this option, be sure to enquote arguments
181                         so that the shell will not expand them prior to passing
182                         them to the glob command process.
183
184  -a --absolute          Expand to absolute paths
185  -d --dot-relative      Prepend './' on relative matches
186  -m --mark              Append a / on any directories matched
187  -x --posix             Always resolve to posix style paths, using '/' as the
188                         directory separator, even on Windows. Drive letter
189                         absolute matches on Windows will be expanded to their
190                         full resolved UNC maths, eg instead of 'C:\foo\bar', it
191                         will expand to '//?/C:/foo/bar'.
192
193  -f --follow            Follow symlinked directories when expanding '**'
194  -R --realpath          Call 'fs.realpath' on all of the results. In the case
195                         of an entry that cannot be resolved, the entry is
196                         omitted. This incurs a slight performance penalty, of
197                         course, because of the added system calls.
198
199  -s --stat              Call 'fs.lstat' on all entries, whether required or not
200                         to determine if it's a valid match.
201
202  -b --match-base        Perform a basename-only match if the pattern does not
203                         contain any slash characters. That is, '*.js' would be
204                         treated as equivalent to '**/*.js', matching js files
205                         in all directories.
206
207  --dot                  Allow patterns to match files/directories that start
208                         with '.', even if the pattern does not start with '.'
209
210  --nobrace              Do not expand {...} patterns
211  --nocase               Perform a case-insensitive match. This defaults to
212                         'true' on macOS and Windows platforms, and false on all
213                         others.
214
215                         Note: 'nocase' should only be explicitly set when it is
216                         known that the filesystem's case sensitivity differs
217                         from the platform default. If set 'true' on
218                         case-insensitive file systems, then the walk may return
219                         more or less results than expected.
220
221  --nodir                Do not match directories, only files.
222
223                         Note: to *only* match directories, append a '/' at the
224                         end of the pattern.
225
226  --noext                Do not expand extglob patterns, such as '+(a|b)'
227  --noglobstar           Do not expand '**' against multiple path portions. Ie,
228                         treat it as a normal '*' instead.
229
230  --windows-path-no-escape
231                         Use '\' as a path separator *only*, and *never* as an
232                         escape character. If set, all '\' characters are
233                         replaced with '/' in the pattern.
234
235  -D<n> --max-depth=<n>  Maximum depth to traverse from the current working
236                         directory
237
238  -C<cwd> --cwd=<cwd>    Current working directory to execute/match in
239  -r<root> --root=<root> A string path resolved against the 'cwd', which is used
240                         as the starting point for absolute patterns that start
241                         with '/' (but not drive letters or UNC paths on
242                         Windows).
243
244                         Note that this *doesn't* necessarily limit the walk to
245                         the 'root' directory, and doesn't affect the cwd
246                         starting point for non-absolute patterns. A pattern
247                         containing '..' will still be able to traverse out of
248                         the root directory, if it is not an actual root
249                         directory on the filesystem, and any non-absolute
250                         patterns will still be matched in the 'cwd'.
251
252                         To start absolute and non-absolute patterns in the same
253                         path, you can use '--root=' to set it to the empty
254                         string. However, be aware that on Windows systems, a
255                         pattern like 'x:/*' or '//host/share/*' will *always*
256                         start in the 'x:/' or '//host/share/' directory,
257                         regardless of the --root setting.
258
259  --platform=<platform>  Defaults to the value of 'process.platform' if
260                         available, or 'linux' if not. Setting --platform=win32
261                         on non-Windows systems may cause strange behavior!
262
263  -i<ignore> --ignore=<ignore>
264                         Glob patterns to ignore Can be set multiple times
265  -v --debug             Output a huge amount of noisy debug information about
266                         patterns as they are parsed and used to match files.
267
268  -h --help              Show this usage information
269```
270
271## `glob(pattern: string | string[], options?: GlobOptions) => Promise<string[] | Path[]>`
272
273Perform an asynchronous glob search for the pattern(s) specified.
274Returns
275[Path](https://isaacs.github.io/path-scurry/classes/PathBase)
276objects if the `withFileTypes` option is set to `true`. See below
277for full options field desciptions.
278
279## `globSync(pattern: string | string[], options?: GlobOptions) => string[] | Path[]`
280
281Synchronous form of `glob()`.
282
283Alias: `glob.sync()`
284
285## `globIterate(pattern: string | string[], options?: GlobOptions) => AsyncGenerator<string>`
286
287Return an async iterator for walking glob pattern matches.
288
289Alias: `glob.iterate()`
290
291## `globIterateSync(pattern: string | string[], options?: GlobOptions) => Generator<string>`
292
293Return a sync iterator for walking glob pattern matches.
294
295Alias: `glob.iterate.sync()`, `glob.sync.iterate()`
296
297## `globStream(pattern: string | string[], options?: GlobOptions) => Minipass<string | Path>`
298
299Return a stream that emits all the strings or `Path` objects and
300then emits `end` when completed.
301
302Alias: `glob.stream()`
303
304## `globStreamSync(pattern: string | string[], options?: GlobOptions) => Minipass<string | Path>`
305
306Syncronous form of `globStream()`. Will read all the matches as
307fast as you consume them, even all in a single tick if you
308consume them immediately, but will still respond to backpressure
309if they're not consumed immediately.
310
311Alias: `glob.stream.sync()`, `glob.sync.stream()`
312
313## `hasMagic(pattern: string | string[], options?: GlobOptions) => boolean`
314
315Returns `true` if the provided pattern contains any "magic" glob
316characters, given the options provided.
317
318Brace expansion is not considered "magic" unless the
319`magicalBraces` option is set, as brace expansion just turns one
320string into an array of strings. So a pattern like `'x{a,b}y'`
321would return `false`, because `'xay'` and `'xby'` both do not
322contain any magic glob characters, and it's treated the same as
323if you had called it on `['xay', 'xby']`. When
324`magicalBraces:true` is in the options, brace expansion _is_
325treated as a pattern having magic.
326
327## `escape(pattern: string, options?: GlobOptions) => string`
328
329Escape all magic characters in a glob pattern, so that it will
330only ever match literal strings
331
332If the `windowsPathsNoEscape` option is used, then characters are
333escaped by wrapping in `[]`, because a magic character wrapped in
334a character class can only be satisfied by that exact character.
335
336Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot
337be escaped or unescaped.
338
339## `unescape(pattern: string, options?: GlobOptions) => string`
340
341Un-escape a glob string that may contain some escaped characters.
342
343If the `windowsPathsNoEscape` option is used, then square-brace
344escapes are removed, but not backslash escapes. For example, it
345will turn the string `'[*]'` into `*`, but it will not turn
346`'\\*'` into `'*'`, because `\` is a path separator in
347`windowsPathsNoEscape` mode.
348
349When `windowsPathsNoEscape` is not set, then both brace escapes
350and backslash escapes are removed.
351
352Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot
353be escaped or unescaped.
354
355## Class `Glob`
356
357An object that can perform glob pattern traversals.
358
359### `const g = new Glob(pattern: string | string[], options: GlobOptions)`
360
361Options object is required.
362
363See full options descriptions below.
364
365Note that a previous `Glob` object can be passed as the
366`GlobOptions` to another `Glob` instantiation to re-use settings
367and caches with a new pattern.
368
369Traversal functions can be called multiple times to run the walk
370again.
371
372### `g.stream()`
373
374Stream results asynchronously,
375
376### `g.streamSync()`
377
378Stream results synchronously.
379
380### `g.iterate()`
381
382Default async iteration function. Returns an AsyncGenerator that
383iterates over the results.
384
385### `g.iterateSync()`
386
387Default sync iteration function. Returns a Generator that
388iterates over the results.
389
390### `g.walk()`
391
392Returns a Promise that resolves to the results array.
393
394### `g.walkSync()`
395
396Returns a results array.
397
398### Properties
399
400All options are stored as properties on the `Glob` object.
401
402- `opts` The options provided to the constructor.
403- `patterns` An array of parsed immutable `Pattern` objects.
404
405## Options
406
407Exported as `GlobOptions` TypeScript interface. A `GlobOptions`
408object may be provided to any of the exported methods, and must
409be provided to the `Glob` constructor.
410
411All options are optional, boolean, and false by default, unless
412otherwise noted.
413
414All resolved options are added to the Glob object as properties.
415
416If you are running many `glob` operations, you can pass a Glob
417object as the `options` argument to a subsequent operation to
418share the previously loaded cache.
419
420- `cwd` String path or `file://` string or URL object. The
421  current working directory in which to search. Defaults to
422  `process.cwd()`. See also: "Windows, CWDs, Drive Letters, and
423  UNC Paths", below.
424
425  This option may be eiher a string path or a `file://` URL
426  object or string.
427
428- `root` A string path resolved against the `cwd` option, which
429  is used as the starting point for absolute patterns that start
430  with `/`, (but not drive letters or UNC paths on Windows).
431
432  Note that this _doesn't_ necessarily limit the walk to the
433  `root` directory, and doesn't affect the cwd starting point for
434  non-absolute patterns. A pattern containing `..` will still be
435  able to traverse out of the root directory, if it is not an
436  actual root directory on the filesystem, and any non-absolute
437  patterns will be matched in the `cwd`. For example, the
438  pattern `/../*` with `{root:'/some/path'}` will return all
439  files in `/some`, not all files in `/some/path`. The pattern
440  `*` with `{root:'/some/path'}` will return all the entries in
441  the cwd, not the entries in `/some/path`.
442
443  To start absolute and non-absolute patterns in the same
444  path, you can use `{root:''}`. However, be aware that on
445  Windows systems, a pattern like `x:/*` or `//host/share/*` will
446  _always_ start in the `x:/` or `//host/share` directory,
447  regardless of the `root` setting.
448
449- `windowsPathsNoEscape` Use `\\` as a path separator _only_, and
450  _never_ as an escape character. If set, all `\\` characters are
451  replaced with `/` in the pattern.
452
453  Note that this makes it **impossible** to match against paths
454  containing literal glob pattern characters, but allows matching
455  with patterns constructed using `path.join()` and
456  `path.resolve()` on Windows platforms, mimicking the (buggy!)
457  behavior of Glob v7 and before on Windows. Please use with
458  caution, and be mindful of [the caveat below about Windows
459  paths](#windows). (For legacy reasons, this is also set if
460  `allowWindowsEscape` is set to the exact value `false`.)
461
462- `dot` Include `.dot` files in normal matches and `globstar`
463  matches. Note that an explicit dot in a portion of the pattern
464  will always match dot files.
465
466- `magicalBraces` Treat brace expansion like `{a,b}` as a "magic"
467  pattern. Has no effect if {@link nobrace} is set.
468
469  Only has effect on the {@link hasMagic} function, no effect on
470  glob pattern matching itself.
471
472- `dotRelative` Prepend all relative path strings with `./` (or
473  `.\` on Windows).
474
475  Without this option, returned relative paths are "bare", so
476  instead of returning `'./foo/bar'`, they are returned as
477  `'foo/bar'`.
478
479  Relative patterns starting with `'../'` are not prepended with
480  `./`, even if this option is set.
481
482- `mark` Add a `/` character to directory matches. Note that this
483  requires additional stat calls.
484
485- `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets.
486
487- `noglobstar` Do not match `**` against multiple filenames. (Ie,
488  treat it as a normal `*` instead.)
489
490- `noext` Do not match "extglob" patterns such as `+(a|b)`.
491
492- `nocase` Perform a case-insensitive match. This defaults to
493  `true` on macOS and Windows systems, and `false` on all others.
494
495  **Note** `nocase` should only be explicitly set when it is
496  known that the filesystem's case sensitivity differs from the
497  platform default. If set `true` on case-sensitive file
498  systems, or `false` on case-insensitive file systems, then the
499  walk may return more or less results than expected.
500
501- `maxDepth` Specify a number to limit the depth of the directory
502  traversal to this many levels below the `cwd`.
503
504- `matchBase` Perform a basename-only match if the pattern does
505  not contain any slash characters. That is, `*.js` would be
506  treated as equivalent to `**/*.js`, matching all js files in
507  all directories.
508
509- `nodir` Do not match directories, only files. (Note: to match
510  _only_ directories, put a `/` at the end of the pattern.)
511
512- `stat` Call `lstat()` on all entries, whether required or not
513  to determine whether it's a valid match. When used with
514  `withFileTypes`, this means that matches will include data such
515  as modified time, permissions, and so on. Note that this will
516  incur a performance cost due to the added system calls.
517
518- `ignore` string or string[], or an object with `ignore` and
519  `ignoreChildren` methods.
520
521  If a string or string[] is provided, then this is treated as a
522  glob pattern or array of glob patterns to exclude from matches.
523  To ignore all children within a directory, as well as the entry
524  itself, append `'/**'` to the ignore pattern.
525
526  **Note** `ignore` patterns are _always_ in `dot:true` mode,
527  regardless of any other settings.
528
529  If an object is provided that has `ignored(path)` and/or
530  `childrenIgnored(path)` methods, then these methods will be
531  called to determine whether any Path is a match or if its
532  children should be traversed, respectively.
533
534- `follow` Follow symlinked directories when expanding `**`
535  patterns. This can result in a lot of duplicate references in
536  the presence of cyclic links, and make performance quite bad.
537
538  By default, a `**` in a pattern will follow 1 symbolic link if
539  it is not the first item in the pattern, or none if it is the
540  first item in the pattern, following the same behavior as Bash.
541
542- `realpath` Set to true to call `fs.realpath` on all of the
543  results. In the case of an entry that cannot be resolved, the
544  entry is omitted. This incurs a slight performance penalty, of
545  course, because of the added system calls.
546
547- `absolute` Set to true to always receive absolute paths for
548  matched files. Set to `false` to always receive relative paths
549  for matched files.
550
551  By default, when this option is not set, absolute paths are
552  returned for patterns that are absolute, and otherwise paths
553  are returned that are relative to the `cwd` setting.
554
555  This does _not_ make an extra system call to get the realpath,
556  it only does string path resolution.
557
558  `absolute` may not be used along with `withFileTypes`.
559
560- `posix` Set to true to use `/` as the path separator in
561  returned results. On posix systems, this has no effect. On
562  Windows systems, this will return `/` delimited path results,
563  and absolute paths will be returned in their full resolved UNC
564  path form, eg insted of `'C:\\foo\\bar'`, it will return
565  `//?/C:/foo/bar`.
566
567- `platform` Defaults to value of `process.platform` if
568  available, or `'linux'` if not. Setting `platform:'win32'` on
569  non-Windows systems may cause strange behavior.
570
571- `withFileTypes` Return [PathScurry](http://npm.im/path-scurry)
572  `Path` objects instead of strings. These are similar to a
573  NodeJS `Dirent` object, but with additional methods and
574  properties.
575
576  `withFileTypes` may not be used along with `absolute`.
577
578- `signal` An AbortSignal which will cancel the Glob walk when
579  triggered.
580
581- `fs` An override object to pass in custom filesystem methods.
582  See [PathScurry docs](http://npm.im/path-scurry) for what can
583  be overridden.
584
585- `scurry` A [PathScurry](http://npm.im/path-scurry) object used
586  to traverse the file system. If the `nocase` option is set
587  explicitly, then any provided `scurry` object must match this
588  setting.
589
590## Glob Primer
591
592Much more information about glob pattern expansion can be found
593by running `man bash` and searching for `Pattern Matching`.
594
595"Globs" are the patterns you type when you do stuff like `ls
596*.js` on the command line, or put `build/*` in a `.gitignore`
597file.
598
599Before parsing the path part patterns, braced sections are
600expanded into a set. Braced sections start with `{` and end with
601`}`, with 2 or more comma-delimited sections within. Braced
602sections may contain slash characters, so `a{/b/c,bcd}` would
603expand into `a/b/c` and `abcd`.
604
605The following characters have special magic meaning when used in
606a path portion. With the exception of `**`, none of these match
607path separators (ie, `/` on all platforms, and `\` on Windows).
608
609- `*` Matches 0 or more characters in a single path portion.
610  When alone in a path portion, it must match at least 1
611  character. If `dot:true` is not specified, then `*` will not
612  match against a `.` character at the start of a path portion.
613- `?` Matches 1 character. If `dot:true` is not specified, then
614  `?` will not match against a `.` character at the start of a
615  path portion.
616- `[...]` Matches a range of characters, similar to a RegExp
617  range. If the first character of the range is `!` or `^` then
618  it matches any character not in the range. If the first
619  character is `]`, then it will be considered the same as `\]`,
620  rather than the end of the character class.
621- `!(pattern|pattern|pattern)` Matches anything that does not
622  match any of the patterns provided. May _not_ contain `/`
623  characters. Similar to `*`, if alone in a path portion, then
624  the path portion must have at least one character.
625- `?(pattern|pattern|pattern)` Matches zero or one occurrence of
626  the patterns provided. May _not_ contain `/` characters.
627- `+(pattern|pattern|pattern)` Matches one or more occurrences of
628  the patterns provided. May _not_ contain `/` characters.
629- `*(a|b|c)` Matches zero or more occurrences of the patterns
630  provided. May _not_ contain `/` characters.
631- `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns
632  provided. May _not_ contain `/` characters.
633- `**` If a "globstar" is alone in a path portion, then it
634  matches zero or more directories and subdirectories searching
635  for matches. It does not crawl symlinked directories, unless
636  `{follow:true}` is passed in the options object. A pattern
637  like `a/b/**` will only match `a/b` if it is a directory.
638  Follows 1 symbolic link if not the first item in the pattern,
639  or 0 if it is the first item, unless `follow:true` is set, in
640  which case it follows all symbolic links.
641
642`[:class:]` patterns are supported by this implementation, but
643`[=c=]` and `[.symbol.]` style class patterns are not.
644
645### Dots
646
647If a file or directory path portion has a `.` as the first
648character, then it will not match any glob pattern unless that
649pattern's corresponding path part also has a `.` as its first
650character.
651
652For example, the pattern `a/.*/c` would match the file at
653`a/.b/c`. However the pattern `a/*/c` would not, because `*` does
654not start with a dot character.
655
656You can make glob treat dots as normal characters by setting
657`dot:true` in the options.
658
659### Basename Matching
660
661If you set `matchBase:true` in the options, and the pattern has
662no slashes in it, then it will seek for any file anywhere in the
663tree with a matching basename. For example, `*.js` would match
664`test/simple/basic.js`.
665
666### Empty Sets
667
668If no matching files are found, then an empty array is returned.
669This differs from the shell, where the pattern itself is
670returned. For example:
671
672```sh
673$ echo a*s*d*f
674a*s*d*f
675```
676
677## Comparisons to other fnmatch/glob implementations
678
679While strict compliance with the existing standards is a
680worthwhile goal, some discrepancies exist between node-glob and
681other implementations, and are intentional.
682
683The double-star character `**` is supported by default, unless
684the `noglobstar` flag is set. This is supported in the manner of
685bsdglob and bash 5, where `**` only has special significance if
686it is the only thing in a path part. That is, `a/**/b` will match
687`a/x/y/b`, but `a/**b` will not.
688
689Note that symlinked directories are not traversed as part of a
690`**`, though their contents may match against subsequent portions
691of the pattern. This prevents infinite loops and duplicates and
692the like. You can force glob to traverse symlinks with `**` by
693setting `{follow:true}` in the options.
694
695There is no equivalent of the `nonull` option. A pattern that
696does not find any matches simply resolves to nothing. (An empty
697array, immediately ended stream, etc.)
698
699If brace expansion is not disabled, then it is performed before
700any other interpretation of the glob pattern. Thus, a pattern
701like `+(a|{b),c)}`, which would not be valid in bash or zsh, is
702expanded **first** into the set of `+(a|b)` and `+(a|c)`, and
703those patterns are checked for validity. Since those two are
704valid, matching proceeds.
705
706The character class patterns `[:class:]` (posix standard named
707classes) style class patterns are supported and unicode-aware,
708but `[=c=]` (locale-specific character collation weight), and
709`[.symbol.]` (collating symbol), are not.
710
711### Repeated Slashes
712
713Unlike Bash and zsh, repeated `/` are always coalesced into a
714single path separator.
715
716### Comments and Negation
717
718Previously, this module let you mark a pattern as a "comment" if
719it started with a `#` character, or a "negated" pattern if it
720started with a `!` character.
721
722These options were deprecated in version 5, and removed in
723version 6.
724
725To specify things that should not match, use the `ignore` option.
726
727## Windows
728
729**Please only use forward-slashes in glob expressions.**
730
731Though windows uses either `/` or `\` as its path separator, only
732`/` characters are used by this glob implementation. You must use
733forward-slashes **only** in glob expressions. Back-slashes will
734always be interpreted as escape characters, not path separators.
735
736Results from absolute patterns such as `/foo/*` are mounted onto
737the root setting using `path.join`. On windows, this will by
738default result in `/foo/*` matching `C:\foo\bar.txt`.
739
740To automatically coerce all `\` characters to `/` in pattern
741strings, **thus making it impossible to escape literal glob
742characters**, you may set the `windowsPathsNoEscape` option to
743`true`.
744
745### Windows, CWDs, Drive Letters, and UNC Paths
746
747On posix systems, when a pattern starts with `/`, any `cwd`
748option is ignored, and the traversal starts at `/`, plus any
749non-magic path portions specified in the pattern.
750
751On Windows systems, the behavior is similar, but the concept of
752an "absolute path" is somewhat more involved.
753
754#### UNC Paths
755
756A UNC path may be used as the start of a pattern on Windows
757platforms. For example, a pattern like: `//?/x:/*` will return
758all file entries in the root of the `x:` drive. A pattern like
759`//ComputerName/Share/*` will return all files in the associated
760share.
761
762UNC path roots are always compared case insensitively.
763
764#### Drive Letters
765
766A pattern starting with a drive letter, like `c:/*`, will search
767in that drive, regardless of any `cwd` option provided.
768
769If the pattern starts with `/`, and is not a UNC path, and there
770is an explicit `cwd` option set with a drive letter, then the
771drive letter in the `cwd` is used as the root of the directory
772traversal.
773
774For example, `glob('/tmp', { cwd: 'c:/any/thing' })` will return
775`['c:/tmp']` as the result.
776
777If an explicit `cwd` option is not provided, and the pattern
778starts with `/`, then the traversal will run on the root of the
779drive provided as the `cwd` option. (That is, it is the result of
780`path.resolve('/')`.)
781
782## Race Conditions
783
784Glob searching, by its very nature, is susceptible to race
785conditions, since it relies on directory walking.
786
787As a result, it is possible that a file that exists when glob
788looks for it may have been deleted or modified by the time it
789returns the result.
790
791By design, this implementation caches all readdir calls that it
792makes, in order to cut down on system overhead. However, this
793also makes it even more susceptible to races, especially if the
794cache object is reused between glob calls.
795
796Users are thus advised not to use a glob result as a guarantee of
797filesystem state in the face of rapid changes. For the vast
798majority of operations, this is never a problem.
799
800### See Also:
801
802- `man sh`
803- `man bash` [Pattern
804  Matching](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html)
805- `man 3 fnmatch`
806- `man 5 gitignore`
807- [minimatch documentation](https://github.com/isaacs/minimatch)
808
809## Glob Logo
810
811Glob's logo was created by [Tanya
812Brassie](http://tanyabrassie.com/). Logo files can be found
813[here](https://github.com/isaacs/node-glob/tree/master/logo).
814
815The logo is licensed under a [Creative Commons
816Attribution-ShareAlike 4.0 International
817License](https://creativecommons.org/licenses/by-sa/4.0/).
818
819## Contributing
820
821Any change to behavior (including bugfixes) must come with a
822test.
823
824Patches that fail tests or reduce performance will be rejected.
825
826```sh
827# to run tests
828npm test
829
830# to re-generate test fixtures
831npm run test-regen
832
833# run the benchmarks
834npm run bench
835
836# to profile javascript
837npm run prof
838```
839
840## Comparison to Other JavaScript Glob Implementations
841
842**tl;dr**
843
844- If you want glob matching that is as faithful as possible to
845  Bash pattern expansion semantics, and as fast as possible
846  within that constraint, _use this module_.
847- If you are reasonably sure that the patterns you will encounter
848  are relatively simple, and want the absolutely fastest glob
849  matcher out there, _use [fast-glob](http://npm.im/fast-glob)_.
850- If you are reasonably sure that the patterns you will encounter
851  are relatively simple, and want the convenience of
852  automatically respecting `.gitignore` files, _use
853  [globby](http://npm.im/globby)_.
854
855There are some other glob matcher libraries on npm, but these
856three are (in my opinion, as of 2023) the best.
857
858---
859
860**full explanation**
861
862Every library reflects a set of opinions and priorities in the
863trade-offs it makes. Other than this library, I can personally
864recommend both [globby](http://npm.im/globby) and
865[fast-glob](http://npm.im/fast-glob), though they differ in their
866benefits and drawbacks.
867
868Both have very nice APIs and are reasonably fast.
869
870`fast-glob` is, as far as I am aware, the fastest glob
871implementation in JavaScript today. However, there are many
872cases where the choices that `fast-glob` makes in pursuit of
873speed mean that its results differ from the results returned by
874Bash and other sh-like shells, which may be surprising.
875
876In my testing, `fast-glob` is around 10-20% faster than this
877module when walking over 200k files nested 4 directories
878deep[1](#fn-webscale). However, there are some inconsistencies
879with Bash matching behavior that this module does not suffer
880from:
881
882- `**` only matches files, not directories
883- `..` path portions are not handled unless they appear at the
884  start of the pattern
885- `./!(<pattern>)` will not match any files that _start_ with
886  `<pattern>`, even if they do not match `<pattern>`. For
887  example, `!(9).txt` will not match `9999.txt`.
888- Some brace patterns in the middle of a pattern will result in
889  failing to find certain matches.
890- Extglob patterns are allowed to contain `/` characters.
891
892Globby exhibits all of the same pattern semantics as fast-glob,
893(as it is a wrapper around fast-glob) and is slightly slower than
894node-glob (by about 10-20% in the benchmark test set, or in other
895words, anywhere from 20-50% slower than fast-glob). However, it
896adds some API conveniences that may be worth the costs.
897
898- Support for `.gitignore` and other ignore files.
899- Support for negated globs (ie, patterns starting with `!`
900  rather than using a separate `ignore` option).
901
902The priority of this module is "correctness" in the sense of
903performing a glob pattern expansion as faithfully as possible to
904the behavior of Bash and other sh-like shells, with as much speed
905as possible.
906
907Note that prior versions of `node-glob` are _not_ on this list.
908Former versions of this module are far too slow for any cases
909where performance matters at all, and were designed with APIs
910that are extremely dated by current JavaScript standards.
911
912---
913
914<small id="fn-webscale">[1]: In the cases where this module
915returns results and `fast-glob` doesn't, it's even faster, of
916course.</small>
917
918![lumpy space princess saying 'oh my GLOB'](https://github.com/isaacs/node-glob/raw/main/oh-my-glob.gif)
919
920### Benchmark Results
921
922First number is time, smaller is better.
923
924Second number is the count of results returned.
925
926```
927--- pattern: '**' ---
928~~ sync ~~
929node fast-glob sync             0m0.598s  200364
930node globby sync                0m0.765s  200364
931node current globSync mjs       0m0.683s  222656
932node current glob syncStream    0m0.649s  222656
933~~ async ~~
934node fast-glob async            0m0.350s  200364
935node globby async               0m0.509s  200364
936node current glob async mjs     0m0.463s  222656
937node current glob stream        0m0.411s  222656
938
939--- pattern: '**/..' ---
940~~ sync ~~
941node fast-glob sync             0m0.486s  0
942node globby sync                0m0.769s  200364
943node current globSync mjs       0m0.564s  2242
944node current glob syncStream    0m0.583s  2242
945~~ async ~~
946node fast-glob async            0m0.283s  0
947node globby async               0m0.512s  200364
948node current glob async mjs     0m0.299s  2242
949node current glob stream        0m0.312s  2242
950
951--- pattern: './**/0/**/0/**/0/**/0/**/*.txt' ---
952~~ sync ~~
953node fast-glob sync             0m0.490s  10
954node globby sync                0m0.517s  10
955node current globSync mjs       0m0.540s  10
956node current glob syncStream    0m0.550s  10
957~~ async ~~
958node fast-glob async            0m0.290s  10
959node globby async               0m0.296s  10
960node current glob async mjs     0m0.278s  10
961node current glob stream        0m0.302s  10
962
963--- pattern: './**/[01]/**/[12]/**/[23]/**/[45]/**/*.txt' ---
964~~ sync ~~
965node fast-glob sync             0m0.500s  160
966node globby sync                0m0.528s  160
967node current globSync mjs       0m0.556s  160
968node current glob syncStream    0m0.573s  160
969~~ async ~~
970node fast-glob async            0m0.283s  160
971node globby async               0m0.301s  160
972node current glob async mjs     0m0.306s  160
973node current glob stream        0m0.322s  160
974
975--- pattern: './**/0/**/0/**/*.txt' ---
976~~ sync ~~
977node fast-glob sync             0m0.502s  5230
978node globby sync                0m0.527s  5230
979node current globSync mjs       0m0.544s  5230
980node current glob syncStream    0m0.557s  5230
981~~ async ~~
982node fast-glob async            0m0.285s  5230
983node globby async               0m0.305s  5230
984node current glob async mjs     0m0.304s  5230
985node current glob stream        0m0.310s  5230
986
987--- pattern: '**/*.txt' ---
988~~ sync ~~
989node fast-glob sync             0m0.580s  200023
990node globby sync                0m0.771s  200023
991node current globSync mjs       0m0.685s  200023
992node current glob syncStream    0m0.649s  200023
993~~ async ~~
994node fast-glob async            0m0.349s  200023
995node globby async               0m0.509s  200023
996node current glob async mjs     0m0.427s  200023
997node current glob stream        0m0.388s  200023
998
999--- pattern: '{**/*.txt,**/?/**/*.txt,**/?/**/?/**/*.txt,**/?/**/?/**/?/**/*.txt,**/?/**/?/**/?/**/?/**/*.txt}' ---
1000~~ sync ~~
1001node fast-glob sync             0m0.589s  200023
1002node globby sync                0m0.771s  200023
1003node current globSync mjs       0m0.716s  200023
1004node current glob syncStream    0m0.684s  200023
1005~~ async ~~
1006node fast-glob async            0m0.351s  200023
1007node globby async               0m0.518s  200023
1008node current glob async mjs     0m0.462s  200023
1009node current glob stream        0m0.468s  200023
1010
1011--- pattern: '**/5555/0000/*.txt' ---
1012~~ sync ~~
1013node fast-glob sync             0m0.496s  1000
1014node globby sync                0m0.519s  1000
1015node current globSync mjs       0m0.539s  1000
1016node current glob syncStream    0m0.567s  1000
1017~~ async ~~
1018node fast-glob async            0m0.285s  1000
1019node globby async               0m0.299s  1000
1020node current glob async mjs     0m0.305s  1000
1021node current glob stream        0m0.301s  1000
1022
1023--- pattern: './**/0/**/../[01]/**/0/../**/0/*.txt' ---
1024~~ sync ~~
1025node fast-glob sync             0m0.484s  0
1026node globby sync                0m0.507s  0
1027node current globSync mjs       0m0.577s  4880
1028node current glob syncStream    0m0.586s  4880
1029~~ async ~~
1030node fast-glob async            0m0.280s  0
1031node globby async               0m0.298s  0
1032node current glob async mjs     0m0.327s  4880
1033node current glob stream        0m0.324s  4880
1034
1035--- pattern: '**/????/????/????/????/*.txt' ---
1036~~ sync ~~
1037node fast-glob sync             0m0.547s  100000
1038node globby sync                0m0.673s  100000
1039node current globSync mjs       0m0.626s  100000
1040node current glob syncStream    0m0.618s  100000
1041~~ async ~~
1042node fast-glob async            0m0.315s  100000
1043node globby async               0m0.414s  100000
1044node current glob async mjs     0m0.366s  100000
1045node current glob stream        0m0.345s  100000
1046
1047--- pattern: './{**/?{/**/?{/**/?{/**/?,,,,},,,,},,,,},,,}/**/*.txt' ---
1048~~ sync ~~
1049node fast-glob sync             0m0.588s  100000
1050node globby sync                0m0.670s  100000
1051node current globSync mjs       0m0.717s  200023
1052node current glob syncStream    0m0.687s  200023
1053~~ async ~~
1054node fast-glob async            0m0.343s  100000
1055node globby async               0m0.418s  100000
1056node current glob async mjs     0m0.519s  200023
1057node current glob stream        0m0.451s  200023
1058
1059--- pattern: '**/!(0|9).txt' ---
1060~~ sync ~~
1061node fast-glob sync             0m0.573s  160023
1062node globby sync                0m0.731s  160023
1063node current globSync mjs       0m0.680s  180023
1064node current glob syncStream    0m0.659s  180023
1065~~ async ~~
1066node fast-glob async            0m0.345s  160023
1067node globby async               0m0.476s  160023
1068node current glob async mjs     0m0.427s  180023
1069node current glob stream        0m0.388s  180023
1070
1071--- pattern: './{*/**/../{*/**/../{*/**/../{*/**/../{*/**,,,,},,,,},,,,},,,,},,,,}/*.txt' ---
1072~~ sync ~~
1073node fast-glob sync             0m0.483s  0
1074node globby sync                0m0.512s  0
1075node current globSync mjs       0m0.811s  200023
1076node current glob syncStream    0m0.773s  200023
1077~~ async ~~
1078node fast-glob async            0m0.280s  0
1079node globby async               0m0.299s  0
1080node current glob async mjs     0m0.617s  200023
1081node current glob stream        0m0.568s  200023
1082
1083--- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/*.txt' ---
1084~~ sync ~~
1085node fast-glob sync             0m0.485s  0
1086node globby sync                0m0.507s  0
1087node current globSync mjs       0m0.759s  200023
1088node current glob syncStream    0m0.740s  200023
1089~~ async ~~
1090node fast-glob async            0m0.281s  0
1091node globby async               0m0.297s  0
1092node current glob async mjs     0m0.544s  200023
1093node current glob stream        0m0.464s  200023
1094
1095--- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/*.txt' ---
1096~~ sync ~~
1097node fast-glob sync             0m0.486s  0
1098node globby sync                0m0.513s  0
1099node current globSync mjs       0m0.734s  200023
1100node current glob syncStream    0m0.696s  200023
1101~~ async ~~
1102node fast-glob async            0m0.286s  0
1103node globby async               0m0.296s  0
1104node current glob async mjs     0m0.506s  200023
1105node current glob stream        0m0.483s  200023
1106
1107--- pattern: './0/**/../1/**/../2/**/../3/**/../4/**/../5/**/../6/**/../7/**/*.txt' ---
1108~~ sync ~~
1109node fast-glob sync             0m0.060s  0
1110node globby sync                0m0.074s  0
1111node current globSync mjs       0m0.067s  0
1112node current glob syncStream    0m0.066s  0
1113~~ async ~~
1114node fast-glob async            0m0.060s  0
1115node globby async               0m0.075s  0
1116node current glob async mjs     0m0.066s  0
1117node current glob stream        0m0.067s  0
1118
1119--- pattern: './**/?/**/?/**/?/**/?/**/*.txt' ---
1120~~ sync ~~
1121node fast-glob sync             0m0.568s  100000
1122node globby sync                0m0.651s  100000
1123node current globSync mjs       0m0.619s  100000
1124node current glob syncStream    0m0.617s  100000
1125~~ async ~~
1126node fast-glob async            0m0.332s  100000
1127node globby async               0m0.409s  100000
1128node current glob async mjs     0m0.372s  100000
1129node current glob stream        0m0.351s  100000
1130
1131--- pattern: '**/*/**/*/**/*/**/*/**' ---
1132~~ sync ~~
1133node fast-glob sync             0m0.603s  200113
1134node globby sync                0m0.798s  200113
1135node current globSync mjs       0m0.730s  222137
1136node current glob syncStream    0m0.693s  222137
1137~~ async ~~
1138node fast-glob async            0m0.356s  200113
1139node globby async               0m0.525s  200113
1140node current glob async mjs     0m0.508s  222137
1141node current glob stream        0m0.455s  222137
1142
1143--- pattern: './**/*/**/*/**/*/**/*/**/*.txt' ---
1144~~ sync ~~
1145node fast-glob sync             0m0.622s  200000
1146node globby sync                0m0.792s  200000
1147node current globSync mjs       0m0.722s  200000
1148node current glob syncStream    0m0.695s  200000
1149~~ async ~~
1150node fast-glob async            0m0.369s  200000
1151node globby async               0m0.527s  200000
1152node current glob async mjs     0m0.502s  200000
1153node current glob stream        0m0.481s  200000
1154
1155--- pattern: '**/*.txt' ---
1156~~ sync ~~
1157node fast-glob sync             0m0.588s  200023
1158node globby sync                0m0.771s  200023
1159node current globSync mjs       0m0.684s  200023
1160node current glob syncStream    0m0.658s  200023
1161~~ async ~~
1162node fast-glob async            0m0.352s  200023
1163node globby async               0m0.516s  200023
1164node current glob async mjs     0m0.432s  200023
1165node current glob stream        0m0.384s  200023
1166
1167--- pattern: './**/**/**/**/**/**/**/**/*.txt' ---
1168~~ sync ~~
1169node fast-glob sync             0m0.589s  200023
1170node globby sync                0m0.766s  200023
1171node current globSync mjs       0m0.682s  200023
1172node current glob syncStream    0m0.652s  200023
1173~~ async ~~
1174node fast-glob async            0m0.352s  200023
1175node globby async               0m0.523s  200023
1176node current glob async mjs     0m0.436s  200023
1177node current glob stream        0m0.380s  200023
1178
1179--- pattern: '**/*/*.txt' ---
1180~~ sync ~~
1181node fast-glob sync             0m0.592s  200023
1182node globby sync                0m0.776s  200023
1183node current globSync mjs       0m0.691s  200023
1184node current glob syncStream    0m0.659s  200023
1185~~ async ~~
1186node fast-glob async            0m0.357s  200023
1187node globby async               0m0.513s  200023
1188node current glob async mjs     0m0.471s  200023
1189node current glob stream        0m0.424s  200023
1190
1191--- pattern: '**/*/**/*.txt' ---
1192~~ sync ~~
1193node fast-glob sync             0m0.585s  200023
1194node globby sync                0m0.766s  200023
1195node current globSync mjs       0m0.694s  200023
1196node current glob syncStream    0m0.664s  200023
1197~~ async ~~
1198node fast-glob async            0m0.350s  200023
1199node globby async               0m0.514s  200023
1200node current glob async mjs     0m0.472s  200023
1201node current glob stream        0m0.424s  200023
1202
1203--- pattern: '**/[0-9]/**/*.txt' ---
1204~~ sync ~~
1205node fast-glob sync             0m0.544s  100000
1206node globby sync                0m0.636s  100000
1207node current globSync mjs       0m0.626s  100000
1208node current glob syncStream    0m0.621s  100000
1209~~ async ~~
1210node fast-glob async            0m0.322s  100000
1211node globby async               0m0.404s  100000
1212node current glob async mjs     0m0.360s  100000
1213node current glob stream        0m0.352s  100000
1214```
1215