Cambiar el nombre de los archivos usando node.js

90

Soy bastante nuevo en el uso de JS, así que intentaré ser lo más específico que pueda :)

  • Tengo una carpeta con 260 archivos .png con diferentes nombres de países: Afghanistan.png, Albania.png, Algeria.png, etc.

  • Tengo un archivo .json con un fragmento de código con todos los códigos ISO para cada país como este:

{  
  "AF": "Afganistán",  
  "AL": "Albania",  
  "DZ": "Argelia",  
  ...  
}
  • Me gustaría cambiar el nombre de los archivos .png con su nombre ISO en minúsculas. Eso significa que me gustaría tener la siguiente entrada en mi carpeta con todas las .pngimágenes: af.png, al.png, dz.png, etc.

Estaba tratando de investigar por mí mismo cómo hacer esto con node.js, pero estoy un poco perdido aquí y agradecería mucho algunas pistas.

¡Gracias por adelantado!

jlalovi
fuente

Respuestas:

154

Deberá usar fspara eso: http://nodejs.org/api/fs.html

Y en particular la fs.rename()función:

var fs = require('fs');
fs.rename('/path/to/Afghanistan.png', '/path/to/AF.png', function(err) {
    if ( err ) console.log('ERROR: ' + err);
});

Ponlo en un bucle sobre las claves y valores de tu objeto JSON recién leído, y tendrás un script de cambio de nombre por lotes.

fs.readFile('/path/to/countries.json', function(error, data) {
    if (error) {
        console.log(error);
        return;
    }

    var obj = JSON.parse(data);
    for(var p in obj) {
        fs.rename('/path/to/' + obj[p] + '.png', '/path/to/' + p + '.png', function(err) {
            if ( err ) console.log('ERROR: ' + err);
        });
    }
});

(Aquí se asume que su .jsonarchivo es confiable y que es seguro usar sus claves y valores directamente en los nombres de archivo. Si ese no es el caso, ¡asegúrese de escapar de ellos correctamente!)

VoteyDisciple
fuente
9
Las últimas 2 líneas de su respuesta son muy importantes :)
Pranav
simplemente puede importar .json: const obj = require('/path/to/countries.json');y luego:for(var p in obj) {...}
ViES
1
Podrías, pero ... no lo hagas. El uso require ejecuta código en ese archivo. Estás introduciendo una forma para que alguien potencialmente inyecte código malicioso en la aplicación (es decir, modificando el archivo .json). Leer y usar JSON.parse()evita eso por completo. No comprometa la seguridad por escribir un poco menos de código.
VoteyDisciple
Es más seguro usar path.resolve en lugar de concatenar su cadena de ruta.
JulianSoto
Para versión sincrónicafs.renameSync(oldPath, newPath);
Tim
9
  1. fs.readdir (ruta, devolución de llamada)
  2. fs.rename (antiguo, nuevo, devolución de llamada)

Atravesar http://nodejs.org/api/fs.html

Una cosa importante: también puede utilizar las funciones de sincronización. (Funcionará como el programa C)

Pranav
fuente
7

Para el cambio de nombre sincrónico, use fs.renameSync

fs.renameSync('/path/to/Afghanistan.png', '/path/to/AF.png');
Viejo
fuente
2

Para el sistema operativo Linux / Unix, puede usar la sintaxis de shell

const shell = require('child_process').execSync ; 

const currentPath= `/path/to/name.png`;
const newPath= `/path/to/another_name.png`;

shell(`mv ${currentPath} ${newPath}`);

¡Eso es!

Abdennour TOUMI
fuente
1
¿Hay alguna razón por la que se prefiera esto fs.rename?
electrovir
Es sincrónico, pero podría usar nodejs.org/api/fs.html#fs_fs_renamesync_oldpath_newpath
Ole