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 生成指定范围数值随机数
Jan 09 Javascript
myeclipse安装jQuery插件的方法
Mar 29 Javascript
jQuery基础框架浅入剖析
Dec 27 Javascript
js中eval()函数和trim()去掉字符串左右空格应用
Feb 02 Javascript
JS控制阿拉伯数字转为中文大写示例代码
Sep 04 Javascript
Angular之指令Directive用法详解
Mar 01 Javascript
Javascript es7中比较实用的两个方法示例
Jul 21 Javascript
微信小程序 如何引入外部字体库iconfont的图标
Jan 31 Javascript
深入浅析Vue全局组件与局部组件的区别
Jun 15 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
Sep 26 Javascript
解决layui下拉框监听问题(监听不到值的变化)
Sep 28 Javascript
JavaScript实现页面动态验证码的实现示例
Mar 23 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函数与传递参数实例分析
2014/11/15 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
再谈IE中Flash控件的自动激活 ObjectWrap
2007/03/09 Javascript
JavaScript模板入门介绍
2012/09/26 Javascript
javascript 实现简单的table排序及table操作练习
2012/12/28 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
jquery实现弹出层完美居中效果
2014/03/03 Javascript
jQuery中position()方法用法实例
2015/01/16 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
[03:16]DOTA2完美大师赛主赛事首日集锦
2017/11/23 DOTA
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python 生成不重复的随机数的代码
2011/05/15 Python
Python中read()、readline()和readlines()三者间的区别和用法
2017/07/30 Python
windows下python 3.6.4安装配置图文教程
2018/08/21 Python
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
对matplotlib改变colorbar位置和方向的方法详解
2018/12/13 Python
django模板结构优化的方法
2019/02/28 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
Pytorch转tflite方式
2020/05/25 Python
详解Python设计模式之策略模式
2020/06/15 Python
python 带时区的日期格式化操作
2020/10/23 Python
Python中过滤字符串列表的方法
2020/12/22 Python
新年抽奖获奖感言
2014/03/02 职场文书
法人代表委托书
2014/04/04 职场文书
总经理人事任命书
2014/06/05 职场文书
八一建军节慰问信
2015/02/14 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python