Renommer les fichiers à l'aide de node.js

90

Je suis assez nouveau dans l'utilisation de JS, je vais donc essayer d'être aussi précis que possible :)

  • J'ai un dossier avec les fichiers de 260 avec différents noms de pays: Afghanistan.png, Albania.png, Algeria.png, etc.

  • J'ai un fichier .json avec un morceau de code avec tous les codes ISO pour chaque pays comme ceci:

{  
  "AF": "Afghanistan",  
  "AL": "Albanie",  
  "DZ": "Algérie",  
  ...  
}
  • Je voudrais renommer les fichiers .png avec leur nom ISO en minuscules. Cela signifie que je voudrais avoir l'entrée suivante dans mon dossier avec toutes les .pngimages: af.png, al.png, dz.png, etc.

J'essayais de rechercher par moi-même comment faire cela avec node.js, mais je suis un peu perdu ici et j'apprécierais beaucoup quelques indices.

Merci d'avance!

jlalovi
la source

Réponses:

154

Vous devrez utiliser fspour cela: http://nodejs.org/api/fs.html

Et en particulier la fs.rename()fonction:

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

Mettez cela en boucle sur les clés et les valeurs de votre objet JSON fraîchement lu, et vous avez un script de changement de nom par lots.

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

(Cela suppose ici que votre .jsonfichier est digne de confiance et qu'il est sûr d'utiliser ses clés et ses valeurs directement dans les noms de fichiers. Si ce n'est pas le cas, veillez à les échapper correctement!)

VoteyDisciple
la source
9
Les 2 dernières lignes de votre réponse sont très importantes :)
Pranav
vous pouvez simplement importer .json: const obj = require('/path/to/countries.json');et ensuite:for(var p in obj) {...}
ViES
1
Vous pourriez, mais ... ne le faites pas. L'utilisation du require code exécute dans ce fichier. Vous introduisez un moyen pour quelqu'un d'injecter potentiellement du code malveillant dans l'application (c'est-à-dire en modifiant le fichier .json). La lecture et l'utilisation JSON.parse()évitent complètement cela. Ne compromettez pas la sécurité pour écrire un peu moins de code.
VoteyDisciple
Il est plus sûr d'utiliser path.resolve au lieu de concaténer votre chaîne de chemin.
JulianSoto
Pour la version synchronefs.renameSync(oldPath, newPath);
Tim
9
  1. fs.readdir (chemin, rappel)
  2. fs.rename (ancien, nouveau, rappel)

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

Une chose importante - vous pouvez également utiliser les fonctions de synchronisation. (Cela fonctionnera comme le programme C)

Pranav
la source
7

Pour renommer synchrone, utilisez fs.renameSync

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

Pour les OS Linux / Unix, vous pouvez utiliser la syntaxe du shell

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

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

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

C'est ça!

Abdennour TOUMI
la source
1
Y a-t-il une raison pour laquelle cela serait préféré fs.rename?
electrovir
C'est synchrone - Mais pourrait utiliser nodejs.org/api/fs.html#fs_fs_renamesync_oldpath_newpath
Ole