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