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 相关文章推荐
SWFObject Flash js调用类
Jul 08 Javascript
jQuery插件的写法分享
Jun 12 Javascript
JS清空多文本框、文本域示例代码
Feb 24 Javascript
node.js中的console.info方法使用说明
Dec 09 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
Jan 04 Javascript
实例讲解javascript注册事件处理函数
Jan 09 Javascript
JavaScript中ES6 Babel正确安装过程
Jul 18 Javascript
利用js来实现缩略语列表、文献来源链接和快捷键列表
Dec 16 Javascript
js正则表达式验证表单【完整版】
Mar 06 Javascript
解决浏览器会自动填充密码的问题
Apr 28 Javascript
vue使用vue-i18n实现国际化的实现代码
Apr 08 Javascript
Javascript组合继承方法代码实例解析
Apr 02 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在特殊字符前加斜杠的实现代码
2011/07/17 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
Windows7下的php环境配置教程
2015/02/28 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
在线游戏大家来找茬II
2006/09/30 Javascript
日期 时间js控件
2009/05/07 Javascript
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
Extjs4 关于Store的一些操作(加载/回调/添加)
2013/04/18 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
再谈javascript原型继承
2014/11/10 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
BootStrap实现树形目录组件代码详解
2016/06/21 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
详解基于vue-cli优化的webpack配置
2017/11/06 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
jquery实现的分页显示功能示例
2019/08/23 jQuery
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
[00:16]热血竞技场
2019/03/06 DOTA
python多线程扫描端口示例
2014/01/16 Python
python实现bitmap数据结构详解
2014/02/17 Python
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
深入Python解释器理解Python中的字节码
2015/04/01 Python
Python中的列表知识点汇总
2015/04/14 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
python3实现表白神器
2019/04/09 Python
Django models filter筛选条件详解
2020/03/16 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
Java文件和目录(IO)操作
2014/08/26 面试题
公司行政专员岗位职责
2014/08/24 职场文书
教师工作能力自我评价
2015/03/04 职场文书
羊脂球读书笔记
2015/06/30 职场文书
elasticSearch-api的具体操作步骤讲解
2021/06/28 Java/Android