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_03(ExtJs Grid的简单使用)
Oct 02 Javascript
JavaScript Konami Code 实现代码
Jul 29 Javascript
使用JavaScript库还是自己写代码?
Jan 28 Javascript
Jquery Uploadify上传带进度条的简单实例
Feb 12 Javascript
jQuery中选择器小问题(新人难免遇到)
Mar 31 Javascript
纯js实现瀑布流布局及ajax动态新增数据
Apr 07 Javascript
jQuery实现的简单分页示例
Jun 01 Javascript
Javascript数组中push方法用法分析
Oct 31 Javascript
ionic2中使用自动生成器的方法
Mar 04 Javascript
vue如何将v-for中的表格导出来
May 07 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
Sep 13 Javascript
小程序实现图片预览裁剪插件
Nov 22 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
php重定向的三种方法分享
2012/02/22 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
PHP代码维护,重构变困难的4种原因分析
2016/01/25 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
JavaScript 对象、函数和继承
2009/07/07 Javascript
Notify - 基于jquery的消息通知插件
2011/10/18 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
2013/01/24 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
基于JQuery制作可编辑的表格特效
2014/12/23 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
js 递归和定时器的实例解析
2017/02/03 Javascript
xmlplus组件设计系列之文本框(TextBox)(3)
2017/05/03 Javascript
vue ssr 指南详读
2018/06/29 Javascript
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
Node.js npm命令运行node.js脚本的方法
2018/10/10 Javascript
vue 中固定导航栏的实例代码
2019/11/01 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
python读取各种文件数据方法解析
2018/12/29 Python
python实现感知器算法(批处理)
2019/01/18 Python
python日期相关操作实例小结
2019/06/24 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
Python底层封装实现方法详解
2020/01/22 Python
基于Python爬取爱奇艺资源过程解析
2020/03/02 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
2020/04/22 Python
学期研究性学习个人的自我评价
2014/01/09 职场文书
廉洁家庭事迹材料
2014/05/15 职场文书
爱与责任演讲稿
2014/05/20 职场文书
新党章心得体会
2014/09/04 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
设备技术员岗位职责
2015/04/11 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
PYTHON基于Pyecharts绘制常见的直角坐标系图表
2022/04/28 Python