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 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 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