node 对于前后端开发人员来说已经并不陌生了, 对于前端小白来说, node 更是高高在上, 虽然同是 JavaScript, 但是 node 的学习路线还是蛮陡峭的, 对于初出茅庐的程序员或许很难学的进去, 但是学习还是要学, 如果是带着问题去学习, 或许就不会那么枯燥, 学习起来也会事半功倍.
今天就就带着一个问题来看看, node 是如何帮助程序员快速解决问题的.
首先, 问题如下: 工作上要处理大量图片, 设计师给我的是中文命名的图片, 众所周知, 中文在程序中可能会出现乱码, 所以我需要把中文名字改成英文;
由于图片量很大, 一个一个手动去改, 真是累死. 懒癌末期的我怎么可能一个一个手动的去改呢, 于是就想有没有批量修改文件名的工具呢? 万能的百度告诉我, 还真有, 心急如焚的我立刻下载使用, 可是这些个软件居然是收费的, 免费用户只能一次处理几张图片, 这可不是我需要的. 静下来想一想, 不如自己写个脚本工具, 一次搞定所有问题, 好, 说干就干!
既然需求核心是修改文件名, 首先想到的是使用 node,node 的 fs 模块就是用来和文件系统交互的. 接下来就看看如何使用 node 的 fs 模块实现批量修改文件名.
首先保证你本地已经安装了 node, 新建一个 js 文件, 在文件头部引入 fs 模块;
const fs = require('fs');
复制代码
这里主要使用了 fs 的两个 api:fs.readdir 和 fs.rename,fs.readdir(path,[callback(err,files)]) 会读取目录下的所有文件, path 是路径参数, 回调函数有两个参数, err 是错误信息, files 是读取成功时的文件的集合, 是一个数组; fs.rename(oldPath, newPath, [callback(err)]) 重命名文件, 三个参数分别是原路径, 新路径和回调函数;
设计在命令行中输入形如 "奥迪 - audi" 的参数, 把文件名中的 "奥迪" 转换成 "audi". 这就需要再命令行输入额外的参数. 通过 node 的全局 process.argv 参数获取. 需要注意的是, process.argv 返回命令行脚本的各个参数组成的数组:
$ node rename 奥迪 - audi
复制代码
返回结果是:
- [
- 'C:\\Program Files\\nodejs\\node.exe',
- 'D:\\test_projects\\rename',
- '奥迪 - audi'
- ]
复制代码
可以看出, 返回的结果是一个数组, 前两个元素是 node 的路径和 js 文件的路径, 第三个元素才是真正需要的参数, 所以使用时只提取第三个元素即可; 然后传入这个参数, 把读取的文件名按照这个规则重命名后导出. 下边贴出代码:
- const fs = require('fs');
- let path = './';
- let str = process.argv[2]; // 获取输入的参数
- /**
- 替换函数
- filename -- 需要替换的文件名称
- str -- 替换规则, 由命令行输入获得
- **/
- function replaceName(filename,str){
- str = str.split('-');
- let re = RegExp(str[0],'g'); // 利用正则替换参数
- let newname = filename.replace(re,str[1]);
- return newname;
- };
- // 读取文件目录内容
- fs.readdir(path,(err,files)=>{
- files = files.filter(element=>element.split('.')[1]==='jpg'); // 过滤图片文件
- files.map(filename=>{
- let oldPath = path + filename;
- let newPath = path + replaceName(filename,str);
- fs.rename(oldPath,newPath,(err)=>{
- if(!err){
- console.log(filename + 'is done');
- }
- })
- });
- })
复制代码
以上便是全部代码, 非常简单. 将重命名的代码封装成函数, 在读取到文件时循环调用该函数重命名文件, 最后导出到原路径覆盖原文件.
以上有一点需要注意, 在 replaceName 函数中使用了正则表达式, 这样可以完整准确的把所有同名字段替换掉, 如果直接在正则表达式中加入替换的变量是不起作用的, 正则会把变量当作表达式的一部分解析, 在一番查询后, 可以新建正则对象, 在正则对象中是可以传入参数的, 这样就实现了在正则表达式中加入参数的目的了. 使用时, 命令行进入图片所在目录, 在命令行输入以下命令, 回车执行, 就会把所有文件名中的奥迪字段替换成 audi.
$ node 文件路径 \\rename 奥迪 - audi
来源: https://juejin.im/post/5b99d59de51d450e9c55468e