Перейменування файлів за допомогою node.js


90

Я зовсім новачок у використанні JS, тому намагатимусь бути якомога конкретнішим :)

  • У мене є папка з 260 .png файлів з різними назвами країн: Afghanistan.png, Albania.png, Algeria.pngі т.д.

  • У мене є файл .json з фрагментом коду з усіма кодами ISO для кожної країни, наприклад:

{  
  "AF": "Афганістан",  
  "AL": "Албанія",  
  "DZ": "Алжир",  
  ...  
}
  • Я хотів би перейменувати файли .png з їхніми ISO-назвами з малих літер. Це означає , що я хотів би мати такий вхід в моїй папці з усіма .pngзображеннями: af.png, al.png, dz.pngі т.д.

Я намагався самостійно дослідити, як це зробити за допомогою node.js, але я тут трохи загубився, і я був би дуже вдячний за деякі підказки.

Спасибі заздалегідь!

Відповіді:


153

Для цього вам потрібно буде використовувати fs: http://nodejs.org/api/fs.html

І зокрема fs.rename()функція:

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

Помістіть це в цикл над щойно прочитаними ключами та значеннями об’єкта JSON, і у вас є сценарій пакетного перейменування.

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

(Тут передбачається, що ваш .jsonфайл надійний і безпечно використовувати його ключі та значення безпосередньо в іменах файлів. Якщо це не так, обов’язково уникніть їх належним чином!)


9
останні два рядки вашої відповіді дуже важливі :)
Пранав,

ви можете просто імпортувати .json: const obj = require('/path/to/countries.json');а потім:for(var p in obj) {...}
ViES

1
Ви могли б, але ... ні. Використання require виконуваного коду в цьому файлі. Ви вводите спосіб для когось потенційно ввести шкідливий код у програму (тобто, змінивши файл .json). Читання та використання JSON.parse()уникає цього взагалі. Не компрометуйте безпеку задля написання зовсім небагато коду.
VoteyDisciple

Безпечніше використовувати path.resolve замість конкатенації рядка шляху.
JulianSoto

Для синхронної версіїfs.renameSync(oldPath, newPath);
Тім

9
  1. fs.readdir (шлях, зворотний виклик)
  2. fs.rename (старий, новий, зворотний дзвінок)

Проходити через http://nodejs.org/api/fs.html

Одна важлива річ - ви також можете використовувати функції синхронізації. (Це буде працювати як програма C)


7

Для синхронного перейменування використовуйте fs.renameSync

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

2

Для ОС Linux / Unix ви можете використовувати синтаксис оболонки

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

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

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

Це воно!


1
Чи є причина, чому це було б кращим fs.rename?
електровір

Це синхронно - але міг використовувати nodejs.org/api/fs.html#fs_fs_renamesync_oldpath_newpath
Оле,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.