Leer recursivamente directorios y subdirectorios en JavaScript

Cómo usar `readdirSync` en Node.js para obtener todos los archivos de un directorio y sus subdirectorios.

leer-recursivamente-directorios-subdirectorios-javascript

Para procesar archivos en Node.js primero hay que buscarlos y a veces estos se encuentran en un directorio o incluso en subdirectorios anidados. Podemos usar el método del File System fs.readdirSync para obtener estos archivos de manera recursiva.

Obtener todos los archivos con ciertas extensiones

Podemos utilizar fs.readdirSync, junto con fs.statSync y path.extname, para recorrer de forma recursiva todas las carpetas desde un punto de inicio y filtrar los archivos por su extensión. Este es un patrón común en tareas como generar índices, cargar archivos de configuración o aplicar transformaciones.

const fs = require('fs');
const path = require('path');
function readFilesRecursively(dir, allowedExtensions = []) {
let results = [];
const entries = fs.readdirSync(dir);
for (const entry of entries) {
const fullPath = path.join(dir, entry);
const stats = fs.statSync(fullPath);
if (stats.isDirectory()) {
results = results.concat(readFilesRecursively(fullPath, allowedExtensions));
} else {
if (
allowedExtensions.length === 0 ||
allowedExtensions.includes(path.extname(fullPath))
) {
results.push(fullPath);
}
}
}
return results;
}
// Ejemplo: obtener sólo archivos con extensión .js y .json
const files = readFilesRecursively('./src', ['.js', '.json']);
console.log(files);

De esta manera:

  • Recoge todos los archivos desde un directorio inicial, sin importar cuán anidados estén.
  • Permite restringir los resultados a ciertas extensiones (opcional).
  • No utiliza dependencias externas.

Puede adaptarse fácilmente para incluir exclusiones de carpetas, ordenar resultados o procesar cada archivo sobre la marcha.

Conclusión

Con una función recursiva basada en readdirSync, es posible recorrer cualquier estructura de carpetas en Node.js para obtener todos los archivos deseados. Esta técnica, aunque síncrona, resulta útil en scripts de línea de comandos, herramientas internas o situaciones donde la simplicidad y la ejecución secuencial tienen prioridad sobre el rendimiento en concurrencia.