node package manager


Build Status


fs-expand is a standalone module to fetch all file or directory paths that match the given globbing pattern(s), which is much like grunt.file.expand

The difference from glob is that fs-expand

  • could combine the results of several glob patterns.
  • supports negative matching patterns, such as '!*.js'

expand(pattern, [options], callback);

  • pattern String|Array.<String> accepts either a single glob pattern or an array of globbing patterns. Paths matching patterns that begin with ! will be excluded from the returned array. Patterns are processed in order, so inclusion and exclusion order is significant.
  • options Object supports all glob library options
  • callback function(err, files) the callback function.
  • err Error
  • files Array.<String> filenames found matching the pattern(s)


Type Boolean=false

Only process glob patterns, if a file does not contain globstars, fs-expand will not check the existence of the file.

     |-- a.js
     |-- b.js
], {
  cwd: cwd,
  globOnly: true
}, function(err, files){
  // -> 
  // [ 
  //   'a.js', 
  //   'b.js', 
  //   '' // actually, doesn't exist. 
  // ] 


Type String|Function

Either a valid fs.Stats method name or a function that is passed the matched src filepath and returns true or false.

fs.Stats method name
  filter: 'isDirectory'
Filter function
  filter: function (src) {
    return fs.statSync(src).isFile()

It can also be asynchoronous function by using the common this.async() style, see wrap-as-async for details

  filter: function (src) {
    // Turns the filter function into an async one by calling `this.async()` 
    var done = this.async()
    fs.stat(src, function (err, stat) {
      if (err) {
        return done(err)
      done(null, stat.isFile())


   |-- a.js
   |-- b.js
var expand = require('fs-expand');
expand(['*.js', '*.md'], {
  cwd: dir
}, function(err, files){
    console.log(files); // ['a.js', 'b.js',] 

expand.sync(pattern, [options]);

The synchronous version of expand.

Returns the filenames found.

var files = expand.sync(['*.js', '!a.js']);
console.log(files); // ['b.js']