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之更有效率的字符串替换
Aug 02 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
May 14 Javascript
jquery ajax请求实例深入解析
Nov 26 Javascript
微信小程序 loading(加载中提示框)实例
Oct 28 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
Dec 26 Javascript
浅谈angularjs依赖服务注入写法的注意点
Apr 24 Javascript
学习使用Bootstrap页面排版样式
May 11 Javascript
微信小程序动态显示项目倒计时效果
Jun 13 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
Dec 05 jQuery
AngularJS日期格式化常见操作实例分析
May 17 Javascript
js计时事件实现圆形时钟
Mar 25 Javascript
jQuery 选择器用法基础入门示例
Jan 04 jQuery
详解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
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
PHP实现小偷程序实例
2016/10/31 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
PHP与Web页面交互操作实例分析
2020/06/02 PHP
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
web前端开发JQuery常用实例代码片段(50个)
2015/08/28 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
Javascript点击其他任意地方隐藏关闭DIV实例
2016/06/21 Javascript
关于JavaScript和jQuery的类型判断详解
2016/10/08 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
jQuery 隐藏/显示效果函数用法实例分析
2020/05/20 jQuery
微信小程序入门之绘制时钟
2020/10/22 Javascript
[01:11:11]Alliance vs RNG 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python从入门到精通(DAY 1)
2015/12/20 Python
django开发之settings.py中变量的全局引用详解
2017/03/29 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
python创建ArcGIS shape文件的实现
2019/12/06 Python
Django model.py表单设置默认值允许为空的操作
2020/05/19 Python
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
英国著名书店:Foyles
2018/12/01 全球购物
abstract class和interface有什么区别
2013/08/04 面试题
幼儿园感恩节活动方案2014
2014/10/11 职场文书
作文批改评语
2014/12/25 职场文书
义诊活动总结
2015/02/04 职场文书
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python
Golang中channel的原理解读(推荐)
2021/10/16 Golang