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 相关文章推荐
JavaScript Event学习第五章 高级事件注册模型
Feb 07 Javascript
offsetParent 算法分析
Apr 05 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
Mar 04 Javascript
jQuery如何防止这种冒泡事件发生
Feb 27 Javascript
jQuery消息提示框插件Tipso
May 04 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
Jul 11 Javascript
webpack构建react多页面应用详解
Sep 15 Javascript
LayerClose弹窗关闭刷新方法
Aug 17 Javascript
vscode vue 文件模板的配置方法
Jul 23 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
Apr 27 Javascript
浅析JavaScript中的事件委托机制跟深浅拷贝
Jan 20 Javascript
JavaScript 去重和重复次数统计
Mar 31 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
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
配置eAccelerator和XCache扩展来加速PHP程序的执行
2015/12/22 PHP
为jQuery.Treeview添加右键菜单的实现代码
2010/10/22 Javascript
js 浏览器事件介绍
2012/03/30 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
2014/01/10 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
JavaScript生成SQL查询表单的方法
2015/08/13 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
jquery结婚电子请柬特效源码分享
2015/08/21 Javascript
JS数组去重(4种方法)
2017/03/27 Javascript
浅谈关于axios和session的一些事
2017/07/13 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
express如何使用session与cookie的方法
2018/01/30 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
微信小程序定义和调用全局变量globalData的实现
2019/11/01 Javascript
Vue快速实现通用表单验证功能
2019/12/05 Javascript
python字符串连接方法分析
2016/04/12 Python
Python操作MongoDB详解及实例
2017/05/18 Python
Django 开发环境配置过程详解
2019/07/18 Python
Python range与enumerate函数区别解析
2020/02/28 Python
Python用来做Web开发的优势有哪些
2020/08/05 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
护士自我评价范文
2014/01/25 职场文书
行政助理工作职责范本
2014/03/04 职场文书
我们的节日国庆活动方案
2014/08/19 职场文书
个人四风问题对照检查材料
2014/10/01 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
2015年人事工作总结范文
2015/04/09 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书