Glob Patterns匹配模式使用

前段时间在用workbox时,在作precache时,匹配模式基于的是Glob Pattern模式,因而就看了下相关文档。node

下面翻译一下node-glob的使用,原文:github.com/isaacs/node…git


Glob

像在shell里面,用*等匹配模式来匹配文件。github

Glob基于Javascript实现,使用minimatch库进行匹配。正则表达式

使用

使用npm安装shell

npm i glob
复制代码
var glob = require("glob")

// options可选
glob("**/*.js", options, function (er, files) {
  // files是匹配到的文件数组
  // 若是`options`中的`nonull`为true, 当未发现时, files返回["**/*.js"]
  // `er`是一个错误对象或者null
})
复制代码

Glob 入门

"Glob"是一种模式,相似于在命令行中输入ls *.js,或是在.gitignore文件中写build/*npm

在解析路径模式时,大括号内使用逗号进行分隔,分隔部分能够包含/,因此a{/b/c,bcd}会被展开为a/b/cabcd数组

在匹配路径使用时,如下字符有一些特殊的做用:缓存

  • *:匹配单路径下的 0 个或 多个 字符串。
  • ?:匹配一个字符串。
  • [...]:匹配指定范围内的字符串,相似于正则表达式中的[]。若是[]中的第一个字符串是!或者^,则匹配不在范围内的任意字符串。
  • !(pattern|pattern|pattern):匹配与提供模式中不匹配的内容。
  • ?(pattern|pattern|pattern):匹配提供模式中的 0次 或 1次。
  • +(pattern|pattern|pattern):匹配提供模式中的 1次 或 屡次。
  • *(a|b|c):匹配提供模式中的 0次 或 屡次。
  • @(pattern|pat*|pat?erN):匹配与提供模式中彻底匹配的。
  • **:和*同样,能够匹配路径中的 0个 或 多个,并且**能够匹配当前目录和子目录。但没法抓去符号连接的目录。

.

若是匹配的文件或目录部分以.开头,除非匹配的路径也以.开头,不然不会匹配任何模式。bash

例如 a/.*/c模式会匹配a/.b/c。然而a/*/c模式却不会进行匹配,由于*并非以.开始的。异步

你能够经过设置option dot:true,让Glob把.作为正常字符串。

Basename的匹配

若是你在 option中设置matchBase:true,当模式中没有/,它会在任意目录下去匹配。例如*.js会匹配到test/simple/basic.js

空集

若是没有匹配到任何文件,它会返回空数组[]。它与shell不同,shell会在未匹配的状况下返回自己。例如:

$ echo a*s*d*f
a*s*d*f
复制代码

能够经过设置optionnonull:true,来得到和bash shell同样的效果。

glob.hasMagic(pattern, [options])

若是pattern中有任何特殊字符串,则返回为true,不然返回为false

注意:options会影响结果。 若是options中设置noext:true,那么+(a|b)将不会视为魔术模式。 若是模式中支持{}表达式,那么也属于Magic,例如a/{b/c,x/y}。除非option设置nobrace:true

glob(pattern, [options], cb)

  • pattern {String}: 匹配模式。
  • options {Object}
  • cb {Function}
    • err {Error | null}
    • matches {Array<String>}: 匹配模式后的文件名数组。

执行异步全局搜索。

glob.sync(pattern, [options])

  • pattern {String}:匹配模式。
  • options {Object}
  • return: {Array<String>}:匹配模式下的文件名。

执行异步全局搜索。

Class: glob.Glob

经过实例化glob.Glob来建立Glob对象。

var Glob = require("glob").Glob
var mg = new Glob(pattern, options, cb)
复制代码

它是一个EventEmitter。它会当即执行遍历目录进行匹配。

new glob.Glob(pattern, [options], [cb])

  • pattern {String}: 匹配模式。
  • options {Object}
  • cb {Function}:成功或失败的回掉。
    • err {Error | null}
    • matches {Array<String>}: 匹配后的文件名数组。

注意 若是option设置sync标志, 那么匹配结果能够经过g.found获取。

属性

  • minimatch :glob使用的minimatch对象。
  • options :传入的option对象。
  • aborted :布尔值,在调用abort()时会设置为true。 在abort()后没法再进行全局搜索,可是能够经过从新设置statCache去避免重复系统调用。
  • cache :Object,可能有如下值:
    • false - 路径不存在。
    • true - 路径存在。
    • 'FILE' - 路径存在,但不是目录。
    • 'DIR' - 路径存在,是目录。
    • [file, entries, ...] - 路径存在,结果是数组,相似于fs.readdir的结果。
  • statCachefs.stat结果缓存,避免屡次计算相同路径。
  • symlinks :记录哪些路径是符号连接,与**模式相关。
  • realpathCache :传递给fs.realpath的可选参数,避免没必要要的系统调用。存储在Glob的实例对象上,可重复使用。

事件

  • end:匹配完成后,收到匹配的结果。当nonull设置时,在没有匹配结果的状况下会在返回的数组中包含原匹配模式字符串,默认状况下匹配结果是被排序的, 除非设置nosort
  • match: 每次发现匹配结果就会触发,结果中包含匹配的信息。它不会删除重复数据和解析的真实路径。
  • error:在发生意外错误时触发。 若是设置options.strict,那么任何fs的错误都会触发。
  • abortabort()调用时触发。

方法

  • pause:暂时中止搜索。
  • resume:恢复搜索。
  • abort:终止搜索。

选项

全部Minimatch的选项均可以传递给Glob去改变匹配模式,此外还添加了一些特有的glob-specific

除非另有说明,不然全部选项默认都为false

全部选项也会被添加到Glob对象上。

若是正在运行多个glob操做,能够经过Glob对象的传递options给后面的操做使用,方便某些statreaddir调用。能够经过共享symlinks statCache realpathCache cache option加快并行glob操做。

  • cwd:要搜索的当前目录。默认process.cwd()
  • root:以/开始的挂载位置。默认是path.resolve(options.cwd, "/")(Unix系统是/,其余的一些Windows系统是C:\)。
  • dot:在正常模式和**模式下包含.。注意,在模式字符串中定义的点将始终与.文件匹配。
  • nomount:默认匹配模式中以/开始的会转到根目录的挂载点,以便返回有效的文件路径。设置debug标志关闭此行为。
  • mark:在目录匹配中添加/。注意,这须要额外的stat调用。
  • nosort:结果不排序。
  • stat:设置true统计stat全部结果。它可能会下降性能,而且彻底不必, 除非readdir认为文件存在的不可靠标志。
  • silent:读取目录遇到异常错误,并向stderr打印报警信息。设置optionsilent,关闭警告信息。
  • strict:尝试读取目录遇到异常错误时,进行会继续搜索其余匹配项。设置strict后,当出现这些状况时会引起错误。
  • cache 能够看上同的cache属性。传入以前生成的缓存对象保存一些fs调用。
  • statCache:文件系统信息结果的缓存,防止没必要要的stat调用。 一般不须要设置它,若是你知道文件系统不会在调用中改变,你能够将statCache从一个glob()中调用传递给另外一个的options对象中。
  • symlinks 已知符号连接的缓存。在解析**匹配时,你能够传入上一次生成的符号连接对象用来保存stat调用。
  • sync 弃用:使用glob.sync(pattern, opts)替代。
  • nounique:在一些状况中,{}模式会致使同一个文件在结果中出现屡次。默认状况下,它会防止结果中出现重复值。设置这个属性会关闭这个行为。
  • nonull:设置不返回空数组,而是返回一个包含模式自己的数组。这是glob(3)中的默认值。
  • debug:开启后会在minimatchglob开启日志记录。
  • nobrace:不展开大括号,如{a,b}{1..3}
  • noglobstar:针对多个文件名不匹配**(即 会替换为正常的*)。
  • noext:不去匹配+(a|b)“extglob”模式。
  • nocase:不区分大小写的匹配。注意:在一些不区分大小写的系统中no-magic模式默认会被匹配,statreadir将不会引起错误。
  • matchBase:若是模式中不包含/字符串,则执行仅基于basename匹配。也就是说*.js会被视为**/*.js,会匹配全部目录下的全部js。
  • nodir:只匹配文件,不匹配目录。 (注意:只匹配目录,只须要在模式的最后加上/)
  • ignore:添加模式或glob模式的数组去排除匹配。注意,ignore模式下老是dot:true,其余设置无效。
  • follow**模式下,访问符号连接目录。注意 它可能会致使在出现循环连接时出现大量重复引用。
  • realpath:设置为true会在全部结果中调用fs.realpath。在没法解析的符号连接下,返回匹配结果的完整绝对路径。(虽然它一般是一个失效的符号连接)
  • absolute:设置为真,将会在匹配的结果中接收到绝对路径。与realpath不一样,它也会影响match事件中的返回值。

博客名称:王乐平博客

CSDN博客地址:blog.csdn.net/lecepin

知识共享许可协议
本做品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。
相关文章
相关标签/搜索