node.js glob模式用于排除多个文件

我正在使用npm模块节点glob 。

这段代码recursion地返回当前工作目录中的所有文件。

var glob = require('glob'); glob('**/*', function(err, files) { console.log(files); }); 

样本输出:

 [ 'index.html', 'js', 'js/app.js', 'js/lib.js' ] 

我想排除index.htmljs / lib.js。 我试图用负模式排除这些文件'!' 但没有运气。 有没有办法通过使用模式来实现这一点?

或者没有外部依赖:

 /** Walk directory, list tree without regex excludes */ var fs = require('fs'); var path = require('path'); var walk = function (dir, regExcludes, done) { var results = []; fs.readdir(dir, function (err, list) { if (err) return done(err); var pending = list.length; if (!pending) return done(null, results); list.forEach(function (file) { file = path.join(dir, file); var excluded = false; var len = regExcludes.length; var i = 0; for (; i < len; i++) { if (file.match(regExcludes[i])) { excluded = true; } } // Add if not in regExcludes if(excluded === false) { results.push(file); // Check if its a folder fs.stat(file, function (err, stat) { if (stat && stat.isDirectory()) { // If it is, walk again walk(file, regExcludes, function (err, res) { results = results.concat(res); if (!--pending) { done(null, results); } }); } else { if (!--pending) { done(null, results); } } }); } else { if (!--pending) { done(null, results); } } }); }); }; var regExcludes = [/index\.html/, /js\/lib\.js/, /node_modules/]; walk('.', regExcludes, function(err, results) { if (err) { throw err; } console.log(results); }); 

查看globby ,它支持多种模式和一个Promise API,非常globby

 const globby = require('globby'); globby(['**/*', '!index.html', '!js/lib.js']).then(paths => { console.log(paths); }); 

我想这不再是现实了,但我陷入了同样的问题,并find了答案。

这只能使用npm glob模块完成。 我们需要使用选项作为glob函数的第二个参数

 glob('pattern', {options}, cb) 

有一个options.ignore模式为您的需要。

 var glob = require('glob'); glob("**/*",{"ignore":['index.html', 'js', 'js/app.js', 'js/lib.js']}, function (err, files) { console.log(files); }) 

你可以使用node-globule :

 var globule = require('globule'); var result = globule.find(['**/*', '!index.html', '!js/lib.js']); console.log(result); 

这是我为我的项目写的:

 var glob = require('glob'); var minimatch = require("minimatch"); function globArray(patterns, options) { var i, list = []; if (!Array.isArray(patterns)) { patterns = [patterns]; } patterns.forEach(function (pattern) { if (pattern[0] === "!") { i = list.length-1; while( i > -1) { if (!minimatch(list[i], pattern)) { list.splice(i,1); } i--; } } else { var newList = glob.sync(pattern, options); newList.forEach(function(item){ if (list.indexOf(item)===-1) { list.push(item); } }); } }); return list; } 

并像这样调用(使用数组):

 var paths = globArray(["**/*.css","**/*.js","!**/one.js"], {cwd: srcPath}); 

或者这个(使用单个string):

 var paths = globArray("**/*.js", {cwd: srcPath});