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?

24
demandé sur ke_wa 2014-05-22 18:35:52

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);
});
-4
répondu Koji 2014-05-29 23:51:39

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);
})
35
répondu Sergei Panfilov 2016-03-01 13:02:55

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);
});
35
répondu Sindre Sorhus 2017-01-26 15:46:14

Vous pouvez utiliser node-globule pour:

var globule = require('globule');
var result = globule.find(['**/*', '!index.html', '!js/lib.js']);
console.log(result);
17
répondu stefanbuck 2014-05-22 14:55:31

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});
2
répondu Intervalia 2014-09-25 22:45:21

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

});
1
répondu Ivan Ferrer 2018-07-23 18:54:55