UNPKG

48.4 kBMarkdownView Raw
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 either 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 Note: when `follow` and `nodir` are both set, then symbolic
513 links to directories are also omitted.
514
515- `stat` Call `lstat()` on all entries, whether required or not
516 to determine whether it's a valid match. When used with
517 `withFileTypes`, this means that matches will include data such
518 as modified time, permissions, and so on. Note that this will
519 incur a performance cost due to the added system calls.
520
521- `ignore` string or string[], or an object with `ignore` and
522 `ignoreChildren` methods.
523
524 If a string or string[] is provided, then this is treated as a
525 glob pattern or array of glob patterns to exclude from matches.
526 To ignore all children within a directory, as well as the entry
527 itself, append `'/**'` to the ignore pattern.
528
529 **Note** `ignore` patterns are _always_ in `dot:true` mode,
530 regardless of any other settings.
531
532 If an object is provided that has `ignored(path)` and/or
533 `childrenIgnored(path)` methods, then these methods will be
534 called to determine whether any Path is a match or if its
535 children should be traversed, respectively.
536
537- `follow` Follow symlinked directories when expanding `**`
538 patterns. This can result in a lot of duplicate references in
539 the presence of cyclic links, and make performance quite bad.
540
541 By default, a `**` in a pattern will follow 1 symbolic link if
542 it is not the first item in the pattern, or none if it is the
543 first item in the pattern, following the same behavior as Bash.
544
545 Note: when `follow` and `nodir` are both set, then symbolic
546 links to directories are also omitted.
547
548- `realpath` Set to true to call `fs.realpath` on all of the
549 results. In the case of an entry that cannot be resolved, the
550 entry is omitted. This incurs a slight performance penalty, of
551 course, because of the added system calls.
552
553- `absolute` Set to true to always receive absolute paths for
554 matched files. Set to `false` to always receive relative paths
555 for matched files.
556
557 By default, when this option is not set, absolute paths are
558 returned for patterns that are absolute, and otherwise paths
559 are returned that are relative to the `cwd` setting.
560
561 This does _not_ make an extra system call to get the realpath,
562 it only does string path resolution.
563
564 `absolute` may not be used along with `withFileTypes`.
565
566- `posix` Set to true to use `/` as the path separator in
567 returned results. On posix systems, this has no effect. On
568 Windows systems, this will return `/` delimited path results,
569 and absolute paths will be returned in their full resolved UNC
570 path form, eg insted of `'C:\\foo\\bar'`, it will return
571 `//?/C:/foo/bar`.
572
573- `platform` Defaults to value of `process.platform` if
574 available, or `'linux'` if not. Setting `platform:'win32'` on
575 non-Windows systems may cause strange behavior.
576
577- `withFileTypes` Return [PathScurry](http://npm.im/path-scurry)
578 `Path` objects instead of strings. These are similar to a
579 NodeJS `Dirent` object, but with additional methods and
580 properties.
581
582 `withFileTypes` may not be used along with `absolute`.
583
584- `signal` An AbortSignal which will cancel the Glob walk when
585 triggered.
586
587- `fs` An override object to pass in custom filesystem methods.
588 See [PathScurry docs](http://npm.im/path-scurry) for what can
589 be overridden.
590
591- `scurry` A [PathScurry](http://npm.im/path-scurry) object used
592 to traverse the file system. If the `nocase` option is set
593 explicitly, then any provided `scurry` object must match this
594 setting.
595
596- `includeChildMatches` boolean, default `true`. Do not match any
597 children of any matches. For example, the pattern `**\/foo`
598 would match `a/foo`, but not `a/foo/b/foo` in this mode.
599
600 This is especially useful for cases like "find all
601 `node_modules` folders, but not the ones in `node_modules`".
602
603 In order to support this, the `Ignore` implementation must
604 support an `add(pattern: string)` method. If using the default
605 `Ignore` class, then this is fine, but if this is set to
606 `false`, and a custom `Ignore` is provided that does not have
607 an `add()` method, then it will throw an error.
608
609 **Caveat** It _only_ ignores matches that would be a descendant
610 of a previous match, and only if that descendant is matched
611 _after_ the ancestor is encountered. Since the file system walk
612 happens in indeterminate order, it's possible that a match will
613 already be added before its ancestor, if multiple or braced
614 patterns are used.
615
616 For example:
617
618 ```js
619 const results = await glob(
620 [
621 // likely to match first, since it's just a stat
622 'a/b/c/d/e/f',
623
624 // this pattern is more complicated! It must to various readdir()
625 // calls and test the results against a regular expression, and that
626 // is certainly going to take a little bit longer.
627 //
628 // So, later on, it encounters a match at 'a/b/c/d/e', but it's too
629 // late to ignore a/b/c/d/e/f, because it's already been emitted.
630 'a/[bdf]/?/[a-z]/*',
631 ],
632 { includeChildMatches: false },
633 )
634 ```
635
636 It's best to only set this to `false` if you can be reasonably
637 sure that no components of the pattern will potentially match
638 one another's file system descendants, or if the occasional
639 included child entry will not cause problems.
640
641## Glob Primer
642
643Much more information about glob pattern expansion can be found
644by running `man bash` and searching for `Pattern Matching`.
645
646"Globs" are the patterns you type when you do stuff like `ls
647*.js` on the command line, or put `build/*` in a `.gitignore`
648file.
649
650Before parsing the path part patterns, braced sections are
651expanded into a set. Braced sections start with `{` and end with
652`}`, with 2 or more comma-delimited sections within. Braced
653sections may contain slash characters, so `a{/b/c,bcd}` would
654expand into `a/b/c` and `abcd`.
655
656The following characters have special magic meaning when used in
657a path portion. With the exception of `**`, none of these match
658path separators (ie, `/` on all platforms, and `\` on Windows).
659
660- `*` Matches 0 or more characters in a single path portion.
661 When alone in a path portion, it must match at least 1
662 character. If `dot:true` is not specified, then `*` will not
663 match against a `.` character at the start of a path portion.
664- `?` Matches 1 character. If `dot:true` is not specified, then
665 `?` will not match against a `.` character at the start of a
666 path portion.
667- `[...]` Matches a range of characters, similar to a RegExp
668 range. If the first character of the range is `!` or `^` then
669 it matches any character not in the range. If the first
670 character is `]`, then it will be considered the same as `\]`,
671 rather than the end of the character class.
672- `!(pattern|pattern|pattern)` Matches anything that does not
673 match any of the patterns provided. May _not_ contain `/`
674 characters. Similar to `*`, if alone in a path portion, then
675 the path portion must have at least one character.
676- `?(pattern|pattern|pattern)` Matches zero or one occurrence of
677 the patterns provided. May _not_ contain `/` characters.
678- `+(pattern|pattern|pattern)` Matches one or more occurrences of
679 the patterns provided. May _not_ contain `/` characters.
680- `*(a|b|c)` Matches zero or more occurrences of the patterns
681 provided. May _not_ contain `/` characters.
682- `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns
683 provided. May _not_ contain `/` characters.
684- `**` If a "globstar" is alone in a path portion, then it
685 matches zero or more directories and subdirectories searching
686 for matches. It does not crawl symlinked directories, unless
687 `{follow:true}` is passed in the options object. A pattern
688 like `a/b/**` will only match `a/b` if it is a directory.
689 Follows 1 symbolic link if not the first item in the pattern,
690 or 0 if it is the first item, unless `follow:true` is set, in
691 which case it follows all symbolic links.
692
693`[:class:]` patterns are supported by this implementation, but
694`[=c=]` and `[.symbol.]` style class patterns are not.
695
696### Dots
697
698If a file or directory path portion has a `.` as the first
699character, then it will not match any glob pattern unless that
700pattern's corresponding path part also has a `.` as its first
701character.
702
703For example, the pattern `a/.*/c` would match the file at
704`a/.b/c`. However the pattern `a/*/c` would not, because `*` does
705not start with a dot character.
706
707You can make glob treat dots as normal characters by setting
708`dot:true` in the options.
709
710### Basename Matching
711
712If you set `matchBase:true` in the options, and the pattern has
713no slashes in it, then it will seek for any file anywhere in the
714tree with a matching basename. For example, `*.js` would match
715`test/simple/basic.js`.
716
717### Empty Sets
718
719If no matching files are found, then an empty array is returned.
720This differs from the shell, where the pattern itself is
721returned. For example:
722
723```sh
724$ echo a*s*d*f
725a*s*d*f
726```
727
728## Comparisons to other fnmatch/glob implementations
729
730While strict compliance with the existing standards is a
731worthwhile goal, some discrepancies exist between node-glob and
732other implementations, and are intentional.
733
734The double-star character `**` is supported by default, unless
735the `noglobstar` flag is set. This is supported in the manner of
736bsdglob and bash 5, where `**` only has special significance if
737it is the only thing in a path part. That is, `a/**/b` will match
738`a/x/y/b`, but `a/**b` will not.
739
740Note that symlinked directories are not traversed as part of a
741`**`, though their contents may match against subsequent portions
742of the pattern. This prevents infinite loops and duplicates and
743the like. You can force glob to traverse symlinks with `**` by
744setting `{follow:true}` in the options.
745
746There is no equivalent of the `nonull` option. A pattern that
747does not find any matches simply resolves to nothing. (An empty
748array, immediately ended stream, etc.)
749
750If brace expansion is not disabled, then it is performed before
751any other interpretation of the glob pattern. Thus, a pattern
752like `+(a|{b),c)}`, which would not be valid in bash or zsh, is
753expanded **first** into the set of `+(a|b)` and `+(a|c)`, and
754those patterns are checked for validity. Since those two are
755valid, matching proceeds.
756
757The character class patterns `[:class:]` (posix standard named
758classes) style class patterns are supported and unicode-aware,
759but `[=c=]` (locale-specific character collation weight), and
760`[.symbol.]` (collating symbol), are not.
761
762### Repeated Slashes
763
764Unlike Bash and zsh, repeated `/` are always coalesced into a
765single path separator.
766
767### Comments and Negation
768
769Previously, this module let you mark a pattern as a "comment" if
770it started with a `#` character, or a "negated" pattern if it
771started with a `!` character.
772
773These options were deprecated in version 5, and removed in
774version 6.
775
776To specify things that should not match, use the `ignore` option.
777
778## Windows
779
780**Please only use forward-slashes in glob expressions.**
781
782Though windows uses either `/` or `\` as its path separator, only
783`/` characters are used by this glob implementation. You must use
784forward-slashes **only** in glob expressions. Back-slashes will
785always be interpreted as escape characters, not path separators.
786
787Results from absolute patterns such as `/foo/*` are mounted onto
788the root setting using `path.join`. On windows, this will by
789default result in `/foo/*` matching `C:\foo\bar.txt`.
790
791To automatically coerce all `\` characters to `/` in pattern
792strings, **thus making it impossible to escape literal glob
793characters**, you may set the `windowsPathsNoEscape` option to
794`true`.
795
796### Windows, CWDs, Drive Letters, and UNC Paths
797
798On posix systems, when a pattern starts with `/`, any `cwd`
799option is ignored, and the traversal starts at `/`, plus any
800non-magic path portions specified in the pattern.
801
802On Windows systems, the behavior is similar, but the concept of
803an "absolute path" is somewhat more involved.
804
805#### UNC Paths
806
807A UNC path may be used as the start of a pattern on Windows
808platforms. For example, a pattern like: `//?/x:/*` will return
809all file entries in the root of the `x:` drive. A pattern like
810`//ComputerName/Share/*` will return all files in the associated
811share.
812
813UNC path roots are always compared case insensitively.
814
815#### Drive Letters
816
817A pattern starting with a drive letter, like `c:/*`, will search
818in that drive, regardless of any `cwd` option provided.
819
820If the pattern starts with `/`, and is not a UNC path, and there
821is an explicit `cwd` option set with a drive letter, then the
822drive letter in the `cwd` is used as the root of the directory
823traversal.
824
825For example, `glob('/tmp', { cwd: 'c:/any/thing' })` will return
826`['c:/tmp']` as the result.
827
828If an explicit `cwd` option is not provided, and the pattern
829starts with `/`, then the traversal will run on the root of the
830drive provided as the `cwd` option. (That is, it is the result of
831`path.resolve('/')`.)
832
833## Race Conditions
834
835Glob searching, by its very nature, is susceptible to race
836conditions, since it relies on directory walking.
837
838As a result, it is possible that a file that exists when glob
839looks for it may have been deleted or modified by the time it
840returns the result.
841
842By design, this implementation caches all readdir calls that it
843makes, in order to cut down on system overhead. However, this
844also makes it even more susceptible to races, especially if the
845cache object is reused between glob calls.
846
847Users are thus advised not to use a glob result as a guarantee of
848filesystem state in the face of rapid changes. For the vast
849majority of operations, this is never a problem.
850
851### See Also:
852
853- `man sh`
854- `man bash` [Pattern
855 Matching](https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html)
856- `man 3 fnmatch`
857- `man 5 gitignore`
858- [minimatch documentation](https://github.com/isaacs/minimatch)
859
860## Glob Logo
861
862Glob's logo was created by [Tanya
863Brassie](http://tanyabrassie.com/). Logo files can be found
864[here](https://github.com/isaacs/node-glob/tree/master/logo).
865
866The logo is licensed under a [Creative Commons
867Attribution-ShareAlike 4.0 International
868License](https://creativecommons.org/licenses/by-sa/4.0/).
869
870## Contributing
871
872Any change to behavior (including bugfixes) must come with a
873test.
874
875Patches that fail tests or reduce performance will be rejected.
876
877```sh
878# to run tests
879npm test
880
881# to re-generate test fixtures
882npm run test-regen
883
884# run the benchmarks
885npm run bench
886
887# to profile javascript
888npm run prof
889```
890
891## Comparison to Other JavaScript Glob Implementations
892
893**tl;dr**
894
895- If you want glob matching that is as faithful as possible to
896 Bash pattern expansion semantics, and as fast as possible
897 within that constraint, _use this module_.
898- If you are reasonably sure that the patterns you will encounter
899 are relatively simple, and want the absolutely fastest glob
900 matcher out there, _use [fast-glob](http://npm.im/fast-glob)_.
901- If you are reasonably sure that the patterns you will encounter
902 are relatively simple, and want the convenience of
903 automatically respecting `.gitignore` files, _use
904 [globby](http://npm.im/globby)_.
905
906There are some other glob matcher libraries on npm, but these
907three are (in my opinion, as of 2023) the best.
908
909---
910
911**full explanation**
912
913Every library reflects a set of opinions and priorities in the
914trade-offs it makes. Other than this library, I can personally
915recommend both [globby](http://npm.im/globby) and
916[fast-glob](http://npm.im/fast-glob), though they differ in their
917benefits and drawbacks.
918
919Both have very nice APIs and are reasonably fast.
920
921`fast-glob` is, as far as I am aware, the fastest glob
922implementation in JavaScript today. However, there are many
923cases where the choices that `fast-glob` makes in pursuit of
924speed mean that its results differ from the results returned by
925Bash and other sh-like shells, which may be surprising.
926
927In my testing, `fast-glob` is around 10-20% faster than this
928module when walking over 200k files nested 4 directories
929deep[1](#fn-webscale). However, there are some inconsistencies
930with Bash matching behavior that this module does not suffer
931from:
932
933- `**` only matches files, not directories
934- `..` path portions are not handled unless they appear at the
935 start of the pattern
936- `./!(<pattern>)` will not match any files that _start_ with
937 `<pattern>`, even if they do not match `<pattern>`. For
938 example, `!(9).txt` will not match `9999.txt`.
939- Some brace patterns in the middle of a pattern will result in
940 failing to find certain matches.
941- Extglob patterns are allowed to contain `/` characters.
942
943Globby exhibits all of the same pattern semantics as fast-glob,
944(as it is a wrapper around fast-glob) and is slightly slower than
945node-glob (by about 10-20% in the benchmark test set, or in other
946words, anywhere from 20-50% slower than fast-glob). However, it
947adds some API conveniences that may be worth the costs.
948
949- Support for `.gitignore` and other ignore files.
950- Support for negated globs (ie, patterns starting with `!`
951 rather than using a separate `ignore` option).
952
953The priority of this module is "correctness" in the sense of
954performing a glob pattern expansion as faithfully as possible to
955the behavior of Bash and other sh-like shells, with as much speed
956as possible.
957
958Note that prior versions of `node-glob` are _not_ on this list.
959Former versions of this module are far too slow for any cases
960where performance matters at all, and were designed with APIs
961that are extremely dated by current JavaScript standards.
962
963---
964
965<small id="fn-webscale">[1]: In the cases where this module
966returns results and `fast-glob` doesn't, it's even faster, of
967course.</small>
968
969![lumpy space princess saying 'oh my GLOB'](https://github.com/isaacs/node-glob/raw/main/oh-my-glob.gif)
970
971### Benchmark Results
972
973First number is time, smaller is better.
974
975Second number is the count of results returned.
976
977```
978--- pattern: '**' ---
979~~ sync ~~
980node fast-glob sync 0m0.598s 200364
981node globby sync 0m0.765s 200364
982node current globSync mjs 0m0.683s 222656
983node current glob syncStream 0m0.649s 222656
984~~ async ~~
985node fast-glob async 0m0.350s 200364
986node globby async 0m0.509s 200364
987node current glob async mjs 0m0.463s 222656
988node current glob stream 0m0.411s 222656
989
990--- pattern: '**/..' ---
991~~ sync ~~
992node fast-glob sync 0m0.486s 0
993node globby sync 0m0.769s 200364
994node current globSync mjs 0m0.564s 2242
995node current glob syncStream 0m0.583s 2242
996~~ async ~~
997node fast-glob async 0m0.283s 0
998node globby async 0m0.512s 200364
999node current glob async mjs 0m0.299s 2242
1000node current glob stream 0m0.312s 2242
1001
1002--- pattern: './**/0/**/0/**/0/**/0/**/*.txt' ---
1003~~ sync ~~
1004node fast-glob sync 0m0.490s 10
1005node globby sync 0m0.517s 10
1006node current globSync mjs 0m0.540s 10
1007node current glob syncStream 0m0.550s 10
1008~~ async ~~
1009node fast-glob async 0m0.290s 10
1010node globby async 0m0.296s 10
1011node current glob async mjs 0m0.278s 10
1012node current glob stream 0m0.302s 10
1013
1014--- pattern: './**/[01]/**/[12]/**/[23]/**/[45]/**/*.txt' ---
1015~~ sync ~~
1016node fast-glob sync 0m0.500s 160
1017node globby sync 0m0.528s 160
1018node current globSync mjs 0m0.556s 160
1019node current glob syncStream 0m0.573s 160
1020~~ async ~~
1021node fast-glob async 0m0.283s 160
1022node globby async 0m0.301s 160
1023node current glob async mjs 0m0.306s 160
1024node current glob stream 0m0.322s 160
1025
1026--- pattern: './**/0/**/0/**/*.txt' ---
1027~~ sync ~~
1028node fast-glob sync 0m0.502s 5230
1029node globby sync 0m0.527s 5230
1030node current globSync mjs 0m0.544s 5230
1031node current glob syncStream 0m0.557s 5230
1032~~ async ~~
1033node fast-glob async 0m0.285s 5230
1034node globby async 0m0.305s 5230
1035node current glob async mjs 0m0.304s 5230
1036node current glob stream 0m0.310s 5230
1037
1038--- pattern: '**/*.txt' ---
1039~~ sync ~~
1040node fast-glob sync 0m0.580s 200023
1041node globby sync 0m0.771s 200023
1042node current globSync mjs 0m0.685s 200023
1043node current glob syncStream 0m0.649s 200023
1044~~ async ~~
1045node fast-glob async 0m0.349s 200023
1046node globby async 0m0.509s 200023
1047node current glob async mjs 0m0.427s 200023
1048node current glob stream 0m0.388s 200023
1049
1050--- pattern: '{**/*.txt,**/?/**/*.txt,**/?/**/?/**/*.txt,**/?/**/?/**/?/**/*.txt,**/?/**/?/**/?/**/?/**/*.txt}' ---
1051~~ sync ~~
1052node fast-glob sync 0m0.589s 200023
1053node globby sync 0m0.771s 200023
1054node current globSync mjs 0m0.716s 200023
1055node current glob syncStream 0m0.684s 200023
1056~~ async ~~
1057node fast-glob async 0m0.351s 200023
1058node globby async 0m0.518s 200023
1059node current glob async mjs 0m0.462s 200023
1060node current glob stream 0m0.468s 200023
1061
1062--- pattern: '**/5555/0000/*.txt' ---
1063~~ sync ~~
1064node fast-glob sync 0m0.496s 1000
1065node globby sync 0m0.519s 1000
1066node current globSync mjs 0m0.539s 1000
1067node current glob syncStream 0m0.567s 1000
1068~~ async ~~
1069node fast-glob async 0m0.285s 1000
1070node globby async 0m0.299s 1000
1071node current glob async mjs 0m0.305s 1000
1072node current glob stream 0m0.301s 1000
1073
1074--- pattern: './**/0/**/../[01]/**/0/../**/0/*.txt' ---
1075~~ sync ~~
1076node fast-glob sync 0m0.484s 0
1077node globby sync 0m0.507s 0
1078node current globSync mjs 0m0.577s 4880
1079node current glob syncStream 0m0.586s 4880
1080~~ async ~~
1081node fast-glob async 0m0.280s 0
1082node globby async 0m0.298s 0
1083node current glob async mjs 0m0.327s 4880
1084node current glob stream 0m0.324s 4880
1085
1086--- pattern: '**/????/????/????/????/*.txt' ---
1087~~ sync ~~
1088node fast-glob sync 0m0.547s 100000
1089node globby sync 0m0.673s 100000
1090node current globSync mjs 0m0.626s 100000
1091node current glob syncStream 0m0.618s 100000
1092~~ async ~~
1093node fast-glob async 0m0.315s 100000
1094node globby async 0m0.414s 100000
1095node current glob async mjs 0m0.366s 100000
1096node current glob stream 0m0.345s 100000
1097
1098--- pattern: './{**/?{/**/?{/**/?{/**/?,,,,},,,,},,,,},,,}/**/*.txt' ---
1099~~ sync ~~
1100node fast-glob sync 0m0.588s 100000
1101node globby sync 0m0.670s 100000
1102node current globSync mjs 0m0.717s 200023
1103node current glob syncStream 0m0.687s 200023
1104~~ async ~~
1105node fast-glob async 0m0.343s 100000
1106node globby async 0m0.418s 100000
1107node current glob async mjs 0m0.519s 200023
1108node current glob stream 0m0.451s 200023
1109
1110--- pattern: '**/!(0|9).txt' ---
1111~~ sync ~~
1112node fast-glob sync 0m0.573s 160023
1113node globby sync 0m0.731s 160023
1114node current globSync mjs 0m0.680s 180023
1115node current glob syncStream 0m0.659s 180023
1116~~ async ~~
1117node fast-glob async 0m0.345s 160023
1118node globby async 0m0.476s 160023
1119node current glob async mjs 0m0.427s 180023
1120node current glob stream 0m0.388s 180023
1121
1122--- pattern: './{*/**/../{*/**/../{*/**/../{*/**/../{*/**,,,,},,,,},,,,},,,,},,,,}/*.txt' ---
1123~~ sync ~~
1124node fast-glob sync 0m0.483s 0
1125node globby sync 0m0.512s 0
1126node current globSync mjs 0m0.811s 200023
1127node current glob syncStream 0m0.773s 200023
1128~~ async ~~
1129node fast-glob async 0m0.280s 0
1130node globby async 0m0.299s 0
1131node current glob async mjs 0m0.617s 200023
1132node current glob stream 0m0.568s 200023
1133
1134--- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/../*/**/*.txt' ---
1135~~ sync ~~
1136node fast-glob sync 0m0.485s 0
1137node globby sync 0m0.507s 0
1138node current globSync mjs 0m0.759s 200023
1139node current glob syncStream 0m0.740s 200023
1140~~ async ~~
1141node fast-glob async 0m0.281s 0
1142node globby async 0m0.297s 0
1143node current glob async mjs 0m0.544s 200023
1144node current glob stream 0m0.464s 200023
1145
1146--- pattern: './*/**/../*/**/../*/**/../*/**/../*/**/*.txt' ---
1147~~ sync ~~
1148node fast-glob sync 0m0.486s 0
1149node globby sync 0m0.513s 0
1150node current globSync mjs 0m0.734s 200023
1151node current glob syncStream 0m0.696s 200023
1152~~ async ~~
1153node fast-glob async 0m0.286s 0
1154node globby async 0m0.296s 0
1155node current glob async mjs 0m0.506s 200023
1156node current glob stream 0m0.483s 200023
1157
1158--- pattern: './0/**/../1/**/../2/**/../3/**/../4/**/../5/**/../6/**/../7/**/*.txt' ---
1159~~ sync ~~
1160node fast-glob sync 0m0.060s 0
1161node globby sync 0m0.074s 0
1162node current globSync mjs 0m0.067s 0
1163node current glob syncStream 0m0.066s 0
1164~~ async ~~
1165node fast-glob async 0m0.060s 0
1166node globby async 0m0.075s 0
1167node current glob async mjs 0m0.066s 0
1168node current glob stream 0m0.067s 0
1169
1170--- pattern: './**/?/**/?/**/?/**/?/**/*.txt' ---
1171~~ sync ~~
1172node fast-glob sync 0m0.568s 100000
1173node globby sync 0m0.651s 100000
1174node current globSync mjs 0m0.619s 100000
1175node current glob syncStream 0m0.617s 100000
1176~~ async ~~
1177node fast-glob async 0m0.332s 100000
1178node globby async 0m0.409s 100000
1179node current glob async mjs 0m0.372s 100000
1180node current glob stream 0m0.351s 100000
1181
1182--- pattern: '**/*/**/*/**/*/**/*/**' ---
1183~~ sync ~~
1184node fast-glob sync 0m0.603s 200113
1185node globby sync 0m0.798s 200113
1186node current globSync mjs 0m0.730s 222137
1187node current glob syncStream 0m0.693s 222137
1188~~ async ~~
1189node fast-glob async 0m0.356s 200113
1190node globby async 0m0.525s 200113
1191node current glob async mjs 0m0.508s 222137
1192node current glob stream 0m0.455s 222137
1193
1194--- pattern: './**/*/**/*/**/*/**/*/**/*.txt' ---
1195~~ sync ~~
1196node fast-glob sync 0m0.622s 200000
1197node globby sync 0m0.792s 200000
1198node current globSync mjs 0m0.722s 200000
1199node current glob syncStream 0m0.695s 200000
1200~~ async ~~
1201node fast-glob async 0m0.369s 200000
1202node globby async 0m0.527s 200000
1203node current glob async mjs 0m0.502s 200000
1204node current glob stream 0m0.481s 200000
1205
1206--- pattern: '**/*.txt' ---
1207~~ sync ~~
1208node fast-glob sync 0m0.588s 200023
1209node globby sync 0m0.771s 200023
1210node current globSync mjs 0m0.684s 200023
1211node current glob syncStream 0m0.658s 200023
1212~~ async ~~
1213node fast-glob async 0m0.352s 200023
1214node globby async 0m0.516s 200023
1215node current glob async mjs 0m0.432s 200023
1216node current glob stream 0m0.384s 200023
1217
1218--- pattern: './**/**/**/**/**/**/**/**/*.txt' ---
1219~~ sync ~~
1220node fast-glob sync 0m0.589s 200023
1221node globby sync 0m0.766s 200023
1222node current globSync mjs 0m0.682s 200023
1223node current glob syncStream 0m0.652s 200023
1224~~ async ~~
1225node fast-glob async 0m0.352s 200023
1226node globby async 0m0.523s 200023
1227node current glob async mjs 0m0.436s 200023
1228node current glob stream 0m0.380s 200023
1229
1230--- pattern: '**/*/*.txt' ---
1231~~ sync ~~
1232node fast-glob sync 0m0.592s 200023
1233node globby sync 0m0.776s 200023
1234node current globSync mjs 0m0.691s 200023
1235node current glob syncStream 0m0.659s 200023
1236~~ async ~~
1237node fast-glob async 0m0.357s 200023
1238node globby async 0m0.513s 200023
1239node current glob async mjs 0m0.471s 200023
1240node current glob stream 0m0.424s 200023
1241
1242--- pattern: '**/*/**/*.txt' ---
1243~~ sync ~~
1244node fast-glob sync 0m0.585s 200023
1245node globby sync 0m0.766s 200023
1246node current globSync mjs 0m0.694s 200023
1247node current glob syncStream 0m0.664s 200023
1248~~ async ~~
1249node fast-glob async 0m0.350s 200023
1250node globby async 0m0.514s 200023
1251node current glob async mjs 0m0.472s 200023
1252node current glob stream 0m0.424s 200023
1253
1254--- pattern: '**/[0-9]/**/*.txt' ---
1255~~ sync ~~
1256node fast-glob sync 0m0.544s 100000
1257node globby sync 0m0.636s 100000
1258node current globSync mjs 0m0.626s 100000
1259node current glob syncStream 0m0.621s 100000
1260~~ async ~~
1261node fast-glob async 0m0.322s 100000
1262node globby async 0m0.404s 100000
1263node current glob async mjs 0m0.360s 100000
1264node current glob stream 0m0.352s 100000
1265```