Перейменування файлів за допомогою 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.