node文件批量重命名的方法示例


Posted in Javascript onOctober 23, 2017

在一个实际需求中,需要对一批文件(如:文本、图片)进行重命名,按照数字编号。正好借此熟悉了一下node的fs文件操作,写了一个批量修改文件名的脚本。

需求

现有以下图片文件

node文件批量重命名的方法示例

需要批量修改文件名称,变为统一前缀名称并且自增索引,修改后效果

node文件批量重命名的方法示例

最简单的人力操作就是逐个文件重命名,但本着DRY(Don't repeat yourself)原则,还是写一个node脚本搞定。

研究

node中要进行文件操作需要了解一下fs模块

在fs模块中有同步和异步两种方式

读取文件

//异步
fs.readFile('test.txt', 'utf-8' (err, data) => {
  if (err) {
    throw err;
  }
  console.log(data);
});

//同步
let data = fs.readFileSync('test.txt');
console.log(data);

异步读取文件参数:文件路径,编码方式,回调函数

写入文件

fs.writeFile('test2.txt', 'this is text', { 'flag': 'w' }, err => {
  if (err) {
    throw err;
  }
  console.log('saved');
});

写入文件参数:目标文件,写入内容,写入形式,回调函数

flag写入方式:

r:读取文件
w:写文件
a:追加

创建目录

fs.mkdir('dir', (err) => {
  if (err) {
    throw err;
  }
  console.log('make dir success');
});

dir为新建目录名称

读取目录

fs.readdir('dir',(err, files) => {
  if (err) {
    throw err;
  }
  console.log(files);
});

dir为读取目录名称,files为目录下的文件或目录名称数组

获取文件信息

fs.stat('test.txt', (err, stats)=> {
  console.log(stats.isFile());     //true
})

获取文件信息后stats方法:

方法 说明
stats.isFile() 是否为文件
stats.isDirectory() 是否为目录
stats.isBlockDevice() 是否为块设备
stats.isCharacterDevice() 是否为字符设备
stats.isSymbolicLink() 是否为软链接
stats.isFIFO() 是否为UNIX FIFO命令管道
stats.isSocket() 是否为Socket

创建读取流

let stream = fs.createReadStream('test.txt');

创建写入流

let stream = fs.createWriteStreamr('test_copy.txt');

开发

开发思路:

  1. 读取源目录
  2. 判读存放目录是否存在,不存在时新建目录
  3. 复制文件
  4. 判断复制内容是否为文件
  5. 创建读取流
  6. 创建写入流
  7. 链接管道,写入文件内容
let fs = require('fs'),
  src = 'src',
  dist = 'dist',
  args = process.argv.slice(2),
  filename = 'image',
  index = 0;

//show help
if (args.length === 0 || args[0].match('--help')) {
  console.log('--help\n \t-src 文件源\n \t-dist 文件目标\n \t-n 文件名\n \t-i 文件名索引\n');
  return false;
}

args.forEach((item, i) => {
  if (item.match('-src')) {
    src = args[i + 1];
  } else if (item.match('-dist')) {
    dist = args[i + 1];
  } else if (item.match('-n')) {
    filename = args[i + 1];
  } else if (item.match('-i')) {
    index = args[i + 1];
  }
});

fs.readdir(src, (err, files) => {
  if (err) {
    console.log(err);
  } else {
    fs.exists(dist, exist => {
      if (exist) {
        copyFile(files, src, dist, filename, index);
      } else {
        fs.mkdir(dist, () => {
          copyFile(files, src, dist, filename, index);
        })
      }
    });
  }
});

function copyFile(files, src, dist, filename, index) {
  files.forEach(n => {
    let readStream,
      writeStream,
      arr = n.split('.'),
      oldPath = src + '/' + n,
      newPath = dist + '/' + filename + index + '.' + arr[arr.length - 1];
    fs.stat(oldPath, (err, stats) => {
      if (err) {
        console.log(err);
      } else if (stats.isFile()) {
        readStream = fs.createReadStream(oldPath);
        writeStream = fs.createWriteStream(newPath);
        readStream.pipe(writeStream);
      }
    });
    index++;
  })
}

效果

node文件批量重命名的方法示例

总结

node提供了很多模块可以帮助我们完成不同需求的功能开发,使javascript不仅仅局限与浏览器中,尝试自己编写一些脚本有助于对这些模块的理解,同时也能提高办公效率。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用jQuery技术实现Tab页界面之二
Sep 21 Javascript
ASP 过滤数组重复数据函数(加强版)
May 31 Javascript
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
Oct 29 Javascript
js截取固定长度的中英文字符的简单实例
Nov 22 Javascript
JavaScript通过事件代理高亮显示表格行的方法
May 27 Javascript
js仿百度登录页实现拖动窗口效果
Mar 11 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
Jun 03 Javascript
AngularJS基础 ng-focus 指令简单示例
Aug 01 Javascript
浅谈js中子页面父页面方法 变量相互调用
Aug 04 Javascript
关于js函数解释(包括内嵌,对象等)
Nov 20 Javascript
使用jquery给新生的th绑定hover事件的实例
Feb 10 Javascript
vuejs 制作背景淡入淡出切换动画的实例
Sep 01 Javascript
详解vue 实例方法和数据
Oct 23 #Javascript
深入浅析javascript继承体系
Oct 23 #Javascript
Vue.js组件通信的几种姿势
Oct 23 #Javascript
Vue2.0+ElementUI实现表格翻页的实例
Oct 23 #Javascript
JavaScript之创意时钟项目(实例讲解)
Oct 23 #Javascript
浅谈js的解析顺序 作用域 严格模式
Oct 23 #Javascript
基于Vue2.0+ElementUI实现表格翻页功能
Oct 23 #Javascript
You might like
5.PHP的其他功能
2006/10/09 PHP
用Php实现链结人气统计
2006/10/09 PHP
Ping服务的php实现方法,让网站快速被收录
2012/02/04 PHP
php判断表是否存在的方法
2015/06/18 PHP
PHP自动生成缩略图函数的源码示例
2019/03/18 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
JQuery1.4+ Ajax IE8 内存泄漏问题
2010/10/15 Javascript
JavaScript 一道字符串分解的题目
2011/08/03 Javascript
JavaScript创建对象的写法
2013/08/29 Javascript
JavaScript对象学习经验整理
2013/10/12 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
Js冒泡事件详解及阻止示例
2014/03/21 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
2016/09/04 Javascript
基于JavaScript实现验证码功能
2017/04/01 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
Angular2+如何去除url中的#号详解
2017/12/20 Javascript
详解Vue开发微信H5微信分享签名失败问题解决方案
2018/08/09 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
2019/11/25 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
2019/12/22 Javascript
element跨分页操作选择详解
2020/06/29 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
Vue3 实现双盒子定位Overlay的示例
2020/12/22 Vue.js
[01:02]2014 DOTA2国际邀请赛中国区预选赛 现场抢先看
2014/05/22 DOTA
ptyhon实现sitemap生成示例
2014/03/30 Python
python实现的解析crontab配置文件代码
2014/06/30 Python
用Python创建声明性迷你语言的教程
2015/04/13 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
html5使用html2canvas实现浏览器截图的示例
2017/08/31 HTML / CSS
会计专业自我鉴定范文
2013/10/06 职场文书
旅游饭店管理专业自荐书
2014/06/28 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
JavaScript阻止事件冒泡的方法
2021/12/06 Javascript