Uso de un script de Node.js para mover archivos automáticamente
- 606Palabras
- 3Minutos
- 19 Jul, 2024
Recientemente surgió una necesidad de mover algunos archivos de un directorio específico a otro. Específicamente, si un usuario necesita mover el archivo a.txt, debemos encontrar otros archivos en el directorio actual que tengan el mismo nombre pero con diferentes prefijos, como gz-a.txt, dj-a.txt, ny-a.txt, etc., y mover estos archivos al directorio de destino correspondiente, renombrándolos como a.txt. Después de moverlos, debemos eliminar los archivos originales del directorio fuente.
Ejemplo de estructura de directorios
El directorio fuente (ruta de directorio fuente proporcionada por el usuario, por ejemplo /www/zk-prac/aa/bb/cc) puede contener los siguientes archivos:
1/www/zk-prac/aa/bb/cc/a.txt2/www/zk-prac/aa/bb/cc/gz-a.txt3/www/zk-prac/aa/bb/cc/dj-a.txt4/www/zk-prac/aa/bb/cc/ny-a.txtLa estructura del directorio base de destino (ruta del directorio base de destino proporcionada por el usuario, por ejemplo /www/) es la siguiente:
1/www/gz-prac/aa/bb/cc/2/www/dj-prac/aa/bb/cc/3/www/ny-prac/aa/bb/cc/En este ejemplo, el script necesita mover /www/zk-prac/aa/bb/cc/gz-a.txt a /www/gz-prac/aa/bb/cc/a.txt, /www/zk-prac/aa/bb/cc/dj-a.txt a /www/dj-prac/aa/bb/cc/a.txt y /www/zk-prac/aa/bb/cc/ny-a.txt a /www/ny-prac/aa/bb/cc/a.txt, y luego eliminar el archivo fuente.
Implementación del script
Instalamos dos paquetes de dependencias:
1pnpm add inquirer fs-extraDado que usamos ES Module, necesitamos agregar la siguiente declaración en package.json:
1"type": "module",A continuación, se muestra el script de Node.js para cumplir con este requisito:
1import fs from "fs";2import path from "path";3import fse from "fs-extra";4import inquirer from "inquirer";5
6async function main() {7 // Preguntar al usuario la ruta del directorio fuente8 const { sourceDir } = await inquirer.prompt([9 {10 type: "input",11 name: "sourceDir",12 message: "Por favor, ingrese la ruta del directorio fuente:",13 validate: (input) =>14 fs.existsSync(input)15 ? true16 : "El directorio no existe, por favor ingrese una ruta válida",17 },18 ]);19
20 // Preguntar al usuario la ruta del directorio base de destino21 const { baseTargetDir } = await inquirer.prompt([22 {23 type: "input",24 name: "baseTargetDir",25 message: "Por favor, ingrese la ruta del directorio base de destino:",26 validate: (input) =>27 fs.existsSync(input)28 ? true29 : "El directorio no existe, por favor ingrese una ruta válida",30 },31 ]);32
33 // Preguntar al usuario el nombre del archivo34 const { targetFileName } = await inquirer.prompt([35 {36 type: "input",37 name: "targetFileName",38 message:39 "Por favor, ingrese el nombre del archivo a mover (por ejemplo, a.txt):",40 validate: (input) =>41 input ? true : "El nombre del archivo no puede estar vacío",42 },43 ]);44
45 // Obtener todos los archivos en el directorio fuente46 const files = fs.readdirSync(sourceDir);47
48 // Encontrar todos los archivos objetivo con prefijos49 const matchedFiles = files.filter(50 (file) => file.endsWith(targetFileName) && file !== targetFileName,51 );52
53 if (matchedFiles.length === 0) {54 console.log("No se encontraron archivos con prefijos coincidentes.");55 return;56 }57
58 // Calcular la ruta relativa59 const relativePath = path.relative(baseTargetDir, sourceDir);60
61 // Encontrar y excluir directorios a excluir del directorio base de destino62 const targetPathParts = relativePath.split(path.sep);63 targetPathParts.shift(); // Eliminar el primer directorio64
65 // Calcular la ruta del directorio de destino real66 const subDir = targetPathParts.join(path.sep);67
68 // Mover archivos a cada directorio de destino coincidente69 for (const file of matchedFiles) {70 const prefix = file.split("-")[0];71 const targetDirs = fs72 .readdirSync(baseTargetDir)73 .filter((dir) => dir.startsWith(prefix));74
75 for (const targetDir of targetDirs) {76 const targetPath = path.join(baseTargetDir, targetDir, subDir);77 const sourceFilePath = path.join(sourceDir, file);78 const targetFilePath = path.join(targetPath, targetFileName);79
80 try {81 await fse.ensureDir(targetPath);82 await fse.copy(sourceFilePath, targetFilePath);83 console.log(`Movido ${file} a ${targetFilePath}`);84 await fse.remove(sourceFilePath);85 console.log(`Eliminado archivo fuente ${sourceFilePath}`);86 } catch (err) {87 console.error(`Error al mover o eliminar el archivo: ${err}`);88 }89 }90 }91}92
93main().catch(console.error);Instrucciones de uso
- Al ejecutar el script, primero se le pedirá al usuario que ingrese la ruta del directorio fuente.
- Luego, se le pedirá al usuario que ingrese la ruta del directorio base de destino.
- El usuario debe ingresar el nombre del archivo a mover (por ejemplo,
a.txt). - El script encontrará todos los archivos de destino que contengan el prefijo en el directorio fuente y los moverá al directorio de destino correspondiente, renombrando los archivos como el nombre del archivo especificado por el usuario y eliminando los archivos fuente.