Skip to content

Instantly share code, notes, and snippets.

@victorsollozzo
Created November 23, 2012 09:44
Show Gist options
  • Save victorsollozzo/4134793 to your computer and use it in GitHub Desktop.
Save victorsollozzo/4134793 to your computer and use it in GitHub Desktop.
recursively find all files in a directory with given extension in node.js
var path = require('path')
var fs = require('fs')
function recFindByExt(base,ext,files,result)
{
files = files || fs.readdirSync(base)
result = result || []
files.forEach(
function (file) {
var newbase = path.join(base,file)
if ( fs.statSync(newbase).isDirectory() )
{
result = recFindByExt(newbase,ext,fs.readdirSync(newbase),result)
}
else
{
if ( file.substr(-1*(ext.length+1)) == '.' + ext )
{
result.push(newbase)
}
}
}
)
return result
}
ext_file_list = recFindByExt('/mypath','ext')
@hiulit
Copy link

hiulit commented Jun 15, 2021

I would also add !path.extname(file) just to make sure the function doesn't look inside a macOS .app, because it's actually a folder.

I have it like this:

const path = require('path')
const { readdirSync, statSync } = require('fs-extra')

const findFiles = (dir, ext, files, result, regex) => {
  files = files || readdirSync(dir)
  result = result || []
  regex = regex || new RegExp(`\\${ext}$`)

  for (let i = 0; i < files.length; i++) {
    let file = path.join(dir, files[i])
    if (statSync(file).isDirectory() && !path.extname(file)) {
      try {
        result = findFiles(file, ext, readdirSync(file), result, regex)
      } catch (error) {
        continue
      }
    } else {
      if (regex.test(file)) {
        result.push(file)
      }
    }
  }
  return result
}

@alopezari
Copy link

alopezari commented Nov 9, 2021

Just a recommendation, it would be safer and cleaner replacing the line 18:
if ( file.substr(-1*(ext.length+1)) == '.' + ext )

With the String method endsWith:
if (file.endsWith(featureExtension)) {

Anyway, great job, you inspired and helped a lot of people. Thank you!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment