Renomeando arquivos usando node.js


90

Eu sou bastante novo no uso de JS, então tentarei ser o mais específico possível :)

  • Eu tenho uma pasta com 260 .png arquivos com nomes de países diferentes: Afghanistan.png, Albania.png, Algeria.png, etc.

  • Eu tenho um arquivo .json com um trecho de código com todos os códigos ISO para cada país, como este:

{  
  "AF": "Afeganistão",  
  "AL": "Albânia",  
  "DZ": "Argélia",  
  ...  
}
  • Gostaria de renomear os arquivos .png com seus nomes ISO em letras minúsculas. Isso significa que eu gostaria de ter o seguinte entrada na minha pasta com todas as .pngimagens: af.png, al.png, dz.png, etc.

Eu estava tentando pesquisar sozinho como fazer isso com node.js, mas estou um pouco perdido aqui e gostaria muito de receber algumas pistas.

Desde já, obrigado!

Respostas:


153

Você precisará usar fspara isso: http://nodejs.org/api/fs.html

E em particular a fs.rename()função:

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

Coloque isso em um loop sobre as chaves e valores do objeto JSON recém-lidos e você terá um script de renomeação em lote.

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);
        });
    }
});

(Isso pressupõe que seu .jsonarquivo é confiável e que é seguro usar suas chaves e valores diretamente em nomes de arquivos. Se não for o caso, certifique-se de escapar deles corretamente!)


9
As 2 últimas linhas da sua resposta são muito importantes :)
Pranav

você pode apenas importar .json: const obj = require('/path/to/countries.json');e então:for(var p in obj) {...}
ViES

1
Você poderia, mas ... não faça. O uso de require executa o código nesse arquivo. Você está apresentando uma maneira de alguém potencialmente injetar código malicioso no aplicativo (ou seja, modificando o arquivo .json). Ler e usar JSON.parse()evita isso completamente. Não comprometa a segurança para escrever um pouco menos código.
VoteyDisciple

É mais seguro usar path.resolve em vez de concatenar sua string de caminho.
JulianSoto

Para versão síncronafs.renameSync(oldPath, newPath);
Tim

9
  1. fs.readdir (caminho, retorno de chamada)
  2. fs.rename (antigo, novo, retorno de chamada)

Ir através http://nodejs.org/api/fs.html

Uma coisa importante - você também pode usar as funções de sincronização. (Funcionará como o programa C)


7

Para renomeação síncrona, use fs.renameSync

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.