Переименование файлов с помощью node.js

90

Я новичок в использовании JS, поэтому постараюсь быть максимально конкретным :)

  • У меня есть папка с 260 .png файлов с разными названиями стран: Afghanistan.png, Albania.png, Algeria.pngи т.д.

  • У меня есть файл .json с фрагментом кода со всеми кодами ISO для каждой страны, например:

{  
  «AF»: «Афганистан»,  
  «AL»: «Албания»,  
  «ДЗ»: «Алжир»,  
  ...  
}
  • Я хотел бы переименовать файлы .png, указав их имя ISO в нижнем регистре. Это означает , что я хотел бы иметь следующий вход в моей папке со всеми .pngизображениями: af.png, al.png, dz.pngи т.д.

Я пытался самостоятельно исследовать, как это сделать с помощью node.js, но я немного потерялся здесь и был бы очень признателен за некоторые подсказки.

Заранее спасибо!

Jlalovi
источник

Ответы:

154

Для этого вам нужно будет использовать 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
последние 2 строки вашего ответа очень важны :)
Pranav
вы можете просто импортировать .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?
electrovir
Это синхронно - но можно использовать nodejs.org/api/fs.html#fs_fs_renamesync_oldpath_newpath
Оле