Renombrado Masivo e Inteligente con Node.js
Seamos honestos: ¿Alguna vez has intentado buscar una evidencia importante y te has encontrado navegando en un mar de archivos llamados DCIM_4421.jpg o Captura_002.png?
Sin contexto, la información es solo ruido. Depender de nombres genéricos generados por la cámara o el sistema operativo no solo es desordenado, es una receta para perder datos críticos cuando más los necesitas.
Solo una lógica clara y un script simple pueden poner orden donde hoy reina el caos.
Contexto Automático
En este artículo no vamos a renombrar archivos uno por uno; eso no es digno de un ingeniero. Vamos a construir una solución con Node.js que sea capaz de:
- Leer el entorno (el nombre de la carpeta padre).
- Respetar la historia (la fecha de creación original del archivo).
- Estandarizar el resultado con un índice ordenado.
El objetivo es transformar una carpeta críptica en un historial narrativo:
- ❌ Antes:
IMG_2024.jpg,FOTO_1.png(Nadie sabe qué son) - ✅ Ahora:
2026-05-16_EvidenciasTrabajoFinal_01.jpg(Todo cobra sentido)
Construyendo la Lógica
Para lograr esto, nuestro script debe actuar como un archivador meticuloso. No basta con cambiar nombres; debemos preservar la cronología de los eventos.
Fase 1: Configuración y Contexto
Lo primero es definir nuestro objetivo. Usamos path.basename para extraer automáticamente el nombre de la carpeta final.
Esto es clave: si cambias la ruta, el script se adapta sin que tengas que reescribir variables.
import fs from 'fs/promises';
import path, { extname } from 'path';
// 🎯 La carpeta objetivo (¡Cámbiala por la tuya!)
const TARGET_PATH = "C:\\Users\\unknow\\Pictures\\EvidenciasTrabajoFinal";
// Extraemos "EvidenciasTrabajoFinal" automáticamente
const nombreCarpeta = path.basename(TARGET_PATH);
// Filtro de seguridad: Solo tocamos lo que nos interesa
const EXTENSIONES_VALIDAS = ['.jpg', '.jpeg', '.png'];
Fase 2: Estandarización del Tiempo
Los sistemas operativos guardan fechas, pero nosotros necesitamos texto legible. Creamos una función formatearFecha para convertir un timestamp crudo en un formato ordenable YYYY-MM-DD.
function formatearFecha(fecha) {
const año = fecha.getFullYear();
// Agregamos '0' al inicio si el mes/día es menor a 10 (ej: 05)
const mes = (fecha.getMonth() + 1).toString().padStart(2, '0');
const dia = fecha.getDate().toString().padStart(2, '0');
return `${año}-${mes}-${dia}`;
}
Fase 3: Padding Dinámico
Un error común es nombrar archivos como 1,2...,10. Al ordenarlos en Windows, 10 suele aparecer antes que 2. Calculamos dinámicamente cuántos ceros necesitamos
Por ejemplo : si son 100 archivos, usaremos 3 dígitos : 001, 099, 100.
// Calculamos cuántos dígitos necesitamos según el total de archivos
const cantidadDigitos = archivosConDatos.length.toString().length;
// Dentro del bucle:
const indiceFile = (index + 1).toString().padStart(cantidadDigitos, '0');
Fase 4: Ejecución
Finalmente, construimos el nuevo nombre y aplicamos fs.rename.
const nuevoNombre = `${formatearFecha(file.fecha)}_${nombreCarpeta}_${indiceFile}${file.extension}`;
Fase 5: El Script Completo
Aquí tienes el código completo. Copia, pega y modifica la variable TARGET_PATH con la ruta de tu carpeta desordenada. Ejecútalo y observa cómo el caos desaparece en milisegundos.
import fs from 'fs/promises';
import path, { extname } from 'path';
// ⚙️ CONFIGURACIÓN: Tu ruta aquí
const TARGET_PATH = "C:\\Users\\unknow\\Pictures\\EvidenciasTrabajoFinal";
const nombreCarpeta = path.basename(TARGET_PATH);
const EXTENSIONES_VALIDAS = ['.jpg', '.jpeg', '.png'];
function formatearFecha(fecha) {
const año = fecha.getFullYear();
const mes = (fecha.getMonth() + 1).toString().padStart(2, '0');
const dia = fecha.getDate().toString().padStart(2, '0');
return `${año}-${mes}-${dia}`;
}
function UnionPath(Pathfile, fileName) {
return path.join(Pathfile, fileName);
}
async function Main() {
console.time("Proceso Renombrado");
// 1. Lectura
const archivosRaw = await fs.readdir(TARGET_PATH, { withFileTypes: true });
// 2. Recolección de Datos
const archivosConDatos = await Promise.all(
archivosRaw
.filter(file => file.isFile() && EXTENSIONES_VALIDAS.includes(extname(file.name).toLowerCase()))
.map(async (file) => {
const ruta = UnionPath(file.parentPath || TARGET_PATH, file.name);
const stats = await fs.stat(ruta);
return {
nombreOriginal: file.name,
rutaCompleta: ruta,
fecha: stats.birthtime,
extension: extname(file.name).toLowerCase()
};
})
);
// 3. Ordenamiento Cronológico
archivosConDatos.sort((a, b) => a.fecha - b.fecha);
const cantidadDigitos = archivosConDatos.length.toString().length;
// 4. Renombrado Ejecutado
for (const [index, file] of archivosConDatos.entries()) {
const indiceFile = (index + 1).toString().padStart(cantidadDigitos, '0');
const nuevoNombre = `${formatearFecha(file.fecha)}_${nombreCarpeta}_${indiceFile}${file.extension}`;
const nuevaRuta = UnionPath(TARGET_PATH, nuevoNombre);
if (file.rutaCompleta !== nuevaRuta) {
await fs.rename(file.rutaCompleta, nuevaRuta);
console.log(`✅ [${indiceFile}] ${file.nombreOriginal} -> ${nuevoNombre}`);
}
}
console.timeEnd("Proceso Renombrado");
}
Main();
Conclusión
El orden no es una simple cuestión estética, es una herramienta de productividad. Al transformar nombres crípticos en etiquetas lógicas, no solo estás organizando archivos; estás recuperando el tiempo que perderías buscándolos en el futuro.

Recomendación
¿Quieres optimizar y ordenar tu carpeta de Descargas? Si este script te pareció útil, tenemos una guía específica para limpiar tu carpeta de Downloads clasificando todo por tipo de archivo automáticamente. Lee nuestro artículo aquí y olvídate del desorden