查看树中是否有任何文件与 blob 匹配的最快方法

Fastest way to see if there any file matching a blob in the tree

我只想知道树中是否有任何具有给定扩展名的文件。我正在使用节点。

比如我需要知道src/scripts目录下有没有.jsx文件。如果我们可以使用 blobs/wildecards 来做到这一点,那就更好了,比如 '**/*.jsx'.

我实际上可以使用一个 blob 来 return 所有匹配的文件,或者我可以使用一些递归...但是,一旦我只需要知道是否有任何文件匹配该模式,我认为可能有更好(性能更高)的方法来做到这一点。

有什么建议吗?

我使用包globhttps://www.npmjs.com/package/glob

var glob = require("glob")

// options is optional 
glob("**/*.js", options, function (er, files) {
  // files is an array of filenames. 
  // If the `nonull` option is set, and nothing 
  // was found, then files is ["**/*.js"] 
  // er is an error object or null. 
})

它可能不是最快的,但已用于 9,000 多个其他项目。

手动执行此操作的方法是从有效路径读取所有文件夹和文件并自己进行比较。

好吧,我设法找到了一条出路。 我确实在 glob 存储库中打开了一个问题: https://github.com/isaacs/node-glob/issues/356

但是,与此同时,我们可以使用它们的 API 和 eventEmitter 在第一场比赛中中止。

function thereIsAnyFileMatching (pattern, options = {}) {
  return new Promise((resolve, reject) => {
    let Glob = glob.Glob
    let g = new Glob(pattern, options)
    g.on('match', function(file){
      g.abort() // found
      resolve(true)
    })
    g.on('end', function(){
      resolve(false)
    })
    g.on('error', function(err){
      reject(err)
    })
  })
}

这里唯一的重要问题是,当中止时,"aborted"状态被共享。因此,如果您连续多次调用它,并发性可能会给您带来误报,或者更糟糕的是,永远不会解决("end" 甚至永远不会被触发)。 所以...如果您必须处理并发性,这不是一个直接的解决方案。

我扭转并发性的方法是使用“{...,...}”模式。
因此,例如:{**/*.js,**/*.jsx}
在这种情况下,它只是正在执行的 glob 的一个实例,以寻找任何模式。但是又...有一个问题 :p
它不会告诉您 "match" 事件中匹配的模式。您只需要自己验证它(例如,通过检查文件扩展名)。

我希望有一天这对某人有所帮助:)