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!

Jlalovi
fonte

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!)

VoteyDisciple
fonte
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)

Pranav
fonte
7

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

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

Para o sistema operacional linux / unix, você pode usar a sintaxe do shell

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

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

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

É isso aí!

Abdennour TOUMI
fonte
1
Existe uma razão pela qual isso seria preferido fs.rename?
electrovir
É síncrono - mas poderia usar nodejs.org/api/fs.html#fs_fs_renamesync_oldpath_newpath
Ole