使用Node.js重命名文件

139

我有一个文件夹,里面有260个带有不同国家名称的.png文件:Afghanistan.pngAlbania.pngAlgeria.png等。

我有一个.json文件,其中包含每个国家的ISO代码,例如:

{  
  "AF" : "Afghanistan",  
  "AL" : "Albania",  
  "DZ" : "Algeria",  
  ...  
}

我希望将.png文件重命名为它们的ISO名称(小写)。这意味着我希望我的文件夹中所有的.png图像都具有以下输入:af.pngal.pngdz.png等。

我试图自己研究如何使用node.js实现此目标,但我有点迷失了方向,非常感谢任何提示。

6个回答

226
您需要使用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文件可靠,因此直接将其键和值用于文件名中是安全的。如果不是这种情况,请确保正确转义!)


11
将英语翻译成中文。请仅返回翻译后的文本内容:您回答的最后两行非常重要 :) - Pranav
你可以导入 .json 文件: const obj = require('/path/to/countries.json'); 然后使用以下代码进行遍历: for(var p in obj) {...} - ViES
3
可以这样做,但最好不要。在文件中使用require会执行该文件中的代码。这就为有人潜在地注入恶意代码提供了一种途径(例如,修改.json文件)。而读取和使用JSON.parse()则可以完全避免这种情况。不要为了写出稍微少一点代码而牺牲安全性。 - VoteyDisciple
最好使用path.resolve而不是连接路径字符串,这样更安全。 - JulianSoto
1
对于同步版本 fs.renameSync(oldPath, newPath); - Tim
显示剩余2条评论

30

要进行同步重命名,请使用fs.renameSync

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

8
  1. fs.readdir(路径,回调函数)
  2. fs.rename(旧文件名,新文件名,回调函数)

请访问http://nodejs.org/api/fs.html

一个重要的事情- 您也可以使用同步函数。(它将像C程序一样工作)


5

对于 Linux/Unix 操作系统,您可以使用 shell 语法。

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更受青睐? - derpedy-doo
这是同步的 - 但可以使用https://nodejs.org/api/fs.html#fs_fs_renamesync_oldpath_newpath - Ole

0
VoteyDisciple的回答非常详尽,但如果你想要一个使用Promises的解决方案,你仍然可以使用fs.rename,但要用util.promisify进行封装。
import fs from "fs";
import util from "util";

const rename = util.promisify(fs.rename);

你可以使用fsPromises.rename来实现相同的功能。
import {rename} from "fs/promises";

现在来看一个如何使用这个函数的例子:
try {
    await rename('/path/to/Afghanistan.png', '/path/to/AF.png');
} catch (err) {
    console.error(err);
}

希望能有所帮助

-3
这是一个更新版本的脚本,可以重命名任意目录下的文件; 例如 => "C:\Users\user\Downloads"
const fs = require('fs');

// current file name
const fileName = 'C:\\Users\\user\\Downloads\\oldFileName.jpg';

// new file name
const newFileName = 'C:\\Users\\user\\Downloads\\newFileName.jpg';

fs.rename(fileName, newFileName, function(err) {
    if (err) throw err;
    console.log('File Renamed!');
});

这个脚本使用Node.js中的“fs”模块,将特定路径和文件名的文件(在本例中为“C:\Users\user\Downloads\oldFileName.jpg”)重命名为“C:\Users\user\Downloads\newFileName.jpg”。 “rename”函数接受当前文件名、新文件名和一个回调函数作为参数,在文件重命名后调用该回调函数。如果出现错误,它将抛出一个错误。否则,它将在控制台上打印“文件已重命名!”。


1
很自以为是地假设路径只能在Windows上使用。而且在当前年份,已经有一个基于Promise的rename()版本了。 - Biller Builder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接