Zmiana nazw plików za pomocą node.js

90

Jestem całkiem nowy w używaniu JS, więc postaram się być tak konkretny, jak tylko potrafię :)

  • Mam folder z 260 .png plików z różnymi nazwami krajów: Afghanistan.png, Albania.png, Algeria.png, itd.

  • Mam plik .json z fragmentem kodu ze wszystkimi kodami ISO dla każdego kraju w następujący sposób:

{  
  „AF”: „Afganistan”,  
  „AL”: „Albania”,  
  „DZ”: „Algieria”,  
  ...  
}
  • Chciałbym zmienić nazwy plików .png na ich nazwy ISO pisane małymi literami. Oznacza to, że chciałbym mieć następujący wkład w moim folderze z wszystkich .pngobrazów: af.png, al.png, dz.png, itd.

Próbowałem samodzielnie dowiedzieć się, jak to zrobić z node.js, ale jestem trochę zagubiony i bardzo bym docenił kilka wskazówek.

Z góry dziękuję!

jlalovi
źródło

Odpowiedzi:

153

Będziesz musiał użyć fsdo tego: http://nodejs.org/api/fs.html

A w szczególności fs.rename()funkcja:

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

Umieść to w pętli nad kluczami i wartościami świeżo odczytanego obiektu JSON, a otrzymasz skrypt zmiany nazwy partii.

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

(Zakłada się tutaj, że Twój .jsonplik jest godny zaufania i że można bezpiecznie używać jego kluczy i wartości bezpośrednio w nazwach plików. Jeśli tak nie jest, pamiętaj, aby odpowiednio zmienić znaczenie!)

VoteyDisciple
źródło
9
ostatnie 2 linijki twojej odpowiedzi są bardzo ważne :)
Pranav
możesz po prostu zaimportować .json: const obj = require('/path/to/countries.json');a następnie:for(var p in obj) {...}
ViES
1
Mógłbyś, ale ... nie. Użycie require wykonuje kod w tym pliku. Wprowadzasz sposób, aby ktoś mógł potencjalnie wstrzyknąć złośliwy kod do aplikacji (tj. Zmodyfikować plik .json). Czytanie i używanie JSON.parse()całkowicie tego eliminuje. Nie narażaj bezpieczeństwa, by pisać niewiele mniej kodu.
VoteyDisciple,
Bezpieczniej jest użyć path.resolve zamiast konkatenacji łańcucha ścieżki.
JulianSoto,
Wersja synchronicznafs.renameSync(oldPath, newPath);
Tim
9
  1. fs.readdir (ścieżka, wywołanie zwrotne)
  2. fs.rename (stary, nowy, oddzwonienie)

Iść przez http://nodejs.org/api/fs.html

Jedna ważna rzecz - możesz również korzystać z funkcji synchronizacji. (Będzie działać jak program w C)

Pranav
źródło
7

Do synchronicznej zmiany nazwy użyj fs.renameSync

fs.renameSync('/path/to/Afghanistan.png', '/path/to/AF.png');
Ole
źródło
2

W przypadku systemu Linux / unix można użyć składni powłoki

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

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

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

Otóż ​​to!

Abdennour TOUMI
źródło
1
Czy istnieje powód, dla którego byłoby to preferowane fs.rename?
electrovir
Jest synchroniczny - ale może użyć nodejs.org/api/fs.html#fs_fs_renamesync_oldpath_newpath
Ole