nœud.js glob motif de l'exclusion de plusieurs fichiers
j'utilise le module npm node-glob.
cet extrait retourne récursivement tous les fichiers du répertoire courant.
var glob = require('glob');
glob('**/*', function(err, files) {
console.log(files);
});
sortie de l'échantillon:
[ 'index.html', 'js', 'js/app.js', 'js/lib.js' ]
je veux exclure index.html et js / lib.js. J'ai essayé d'exclure ces fichiers avec d'évolution négative '!' mais sans succès. Est-il un moyen pour atteindre cet objectif qu'en utilisant un modèle?
6 réponses
ou sans dépendance externe:
/**
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);
});
je suppose que ce n'est plus réel mais j'ai été coincé avec la même question et j'ai trouvé une réponse.
ceci peut être fait en utilisant seulement npm glob
module.
Nous avons besoin d'utiliser options comme deuxième paramètre glob
function
glob('pattern', {options}, cb)
Il y a un options.ignore
modèle pour vos besoins.
var glob = require('glob');
glob("**/*",{"ignore":['index.html', 'js', 'js/app.js', 'js/lib.js']}, function (err, files) {
console.log(files);
})
découvrez globby
, qui est à peu près glob
avec la prise en charge de plusieurs modèles et une API Promise:
const globby = require('globby');
globby(['**/*', '!index.html', '!js/lib.js']).then(paths => {
console.log(paths);
});
Vous pouvez utiliser node-globule pour:
var globule = require('globule');
var result = globule.find(['**/*', '!index.html', '!js/lib.js']);
console.log(result);
Voici ce que j'ai écrit pour mon projet:
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;
}
Et de l'appeler comme ceci (à l'Aide d'un tableau):
var paths = globArray(["**/*.css","**/*.js","!**/one.js"], {cwd: srcPath});
ou ce (ou à l'Aide d'une seule chaîne de caractères):
var paths = globArray("**/*.js", {cwd: srcPath});
un exemple d'échantillon avec gulfp:
gulp.task('task_scripts', function(done){
glob("./assets/**/*.js", function (er, files) {
gulp.src(files)
.pipe(gulp.dest('./public/js/'))
.on('end', done);
});
});