node commands node.js glob

commands - Patrón glob de node.js para excluir archivos múltiples



glob node (6)

Aquí está lo que escribí para mi proyecto:

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

Y llámalo así (usando una matriz):

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

o esto (usando una sola cadena):

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

Estoy usando el módulo npm node-glob .

Este fragmento de código devuelve recursivamente todos los archivos en el directorio de trabajo actual.

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

salida de muestra:

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

Quiero excluir index.html y js / lib.js. Intenté excluir estos archivos con un patrón negativo ''!'' pero sin suerte. ¿Hay una manera de lograr esto solo usando un patrón?


Echa un vistazo a globby , que es bastante node-glob con soporte para múltiples patrones y una Promise API:

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


O sin una dependencia externa:

/** 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); });


Puedes usar node-globule para eso:

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


Supongo que ya no es real, pero me quedé atascado con la misma pregunta y encontré una respuesta.

Esto se puede hacer usando solo el módulo npm glob . Necesitamos usar options como un segundo parámetro para la función glob

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

Hay un patrón options.ignore para sus necesidades.

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


Un ejemplo de muestras con trago:

gulp.task(''task_scripts'', function(done){ glob("./assets/**/*.js", function (er, files) { gulp.src(files) .pipe(gulp.dest(''./public/js/'')) .on(''end'', done); }); });