var fs = require('fs'); | |
var common = require('./common'); | |
var _ls = require('./ls'); | |
//@ | |
//@ ### find(path [,path ...]) | |
//@ ### find(path_array) | |
//@ Examples: | |
//@ | |
//@ ```javascript | |
//@ find('src', 'lib'); | |
//@ find(['src', 'lib']); // same as above | |
//@ find('.').filter(function(file) { return file.match(/\.js$/); }); | |
//@ ``` | |
//@ | |
//@ Returns array of all files (however deep) in the given paths. | |
//@ | |
//@ The main difference from `ls('-R', path)` is that the resulting file names | |
//@ include the base directories, e.g. `lib/resources/file1` instead of just `file1`. | |
function _find(options, paths) { | |
if (!paths) | |
common.error('no path specified'); | |
else if (typeof paths === 'object') | |
paths = paths; // assume array | |
else if (typeof paths === 'string') | |
paths = [].slice.call(arguments, 1); | |
var list = []; | |
function pushFile(file) { | |
if (common.platform === 'win') | |
file = file.replace(/\\/g, '/'); | |
list.push(file); | |
} | |
// why not simply do ls('-R', paths)? because the output wouldn't give the base dirs | |
// to get the base dir in the output, we need instead ls('-R', 'dir/*') for every directory | |
paths.forEach(function(file) { | |
pushFile(file); | |
if (fs.statSync(file).isDirectory()) { | |
_ls('-RA', file+'/*').forEach(function(subfile) { | |
pushFile(subfile); | |
}); | |
} | |
}); | |
return list; | |
} | |
module.exports = _find; |