шаблон glob узла node.js для исключения нескольких файлов

Закрытие заданного набора FDs является множеством всех FD, которые должны выполняться, когда те, которые находятся в данном наборе, сохраняются. Т. Е. Множество всех ФД, выводимых из одного в данном множестве некоторой последовательностью аксиом Армстронга. Вам будет сказано, что у каждого набора есть такое закрытие, и оно уникально. И мы можем найти замыкание, неоднократно применяя некоторую аксиому каким-то новым способом, используя заданные и / или полученные до сих пор FD, до тех пор, пока не будут получены новые FD.

Вы нашли один FD, подразумеваемый исходным множеством {A -> DC, D -> B}, а именно A -> BC, применяя одно правило к некоторым FD в наборе. Если вы не смогли получить новый, применив любые другие правила, то замыканием будет множество {A -> DC, D -> B, A -> BC}. Но это не закрытие, потому что вы все равно можете генерировать хотя бы еще один FD, а именно A-> BDC. И тогда есть A -> A. Продолжайте пытаться применить. Закрытие будет множеством всех FD, которые вы можете получить.

Функциональные зависимости Google armstrong's axioms для многих академических объяснений. Например этот .

29
задан ke_wa 22 May 2014 в 14:35
поделиться

6 ответов

Или без внешней зависимости:

/**
    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);
});
-2
ответ дан Koji 22 May 2014 в 14:35
поделиться

Полагаю, это больше не актуально, но я застрял с тем же вопросом и нашел ответ.

Это можно сделать, используя только модуль 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);
})
48
ответ дан Sergei Panfilov 22 May 2014 в 14:35
поделиться

Ознакомьтесь с globby , что довольно много glob с поддержкой нескольких шаблонов и API Promise:

const globby = require('globby');

globby(['**/*', '!index.html', '!js/lib.js']).then(paths => {
    console.log(paths);
});
41
ответ дан Sindre Sorhus 22 May 2014 в 14:35
поделиться

Вот что я написал для своего проекта:

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

или вот это (Используя одну строку):

var paths = globArray("**/*.js", {cwd: srcPath});
2
ответ дан Intervalia 22 May 2014 в 14:35
поделиться

Пример с глотком:

gulp.task('task_scripts', function(done){

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

});
1
ответ дан Ivan Ferrer 22 May 2014 в 14:35
поделиться

Вы можете использовать ноду-глобулу для этого:

var globule = require('globule');
var result = globule.find(['**/*', '!index.html', '!js/lib.js']);
console.log(result);
17
ответ дан stefanbuck 22 May 2014 в 14:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: