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 相关文章推荐
Windows Live的@live.com域名注册漏洞 利用代码
Dec 27 Javascript
JavaScript中实现块作用域的方法
Apr 01 Javascript
自写简单JS判断是否已经弹出页面
Oct 20 Javascript
jQuery Tips 为AJAX回调函数传递额外参数的方法
Dec 28 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
Mar 06 Javascript
改变隐藏的input中value值的方法
Mar 19 Javascript
javascript实现超炫的向上滑行菜单实例
Aug 03 Javascript
轻松实现jquery手风琴效果
Jan 14 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
Dec 22 Javascript
AngularJS 仿微信图片手势缩放的实例
Sep 28 Javascript
Node.js 使用jade模板引擎的示例
May 11 Javascript
node.js实现上传文件功能
Jul 15 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
FCKeditor添加自定义按钮
2008/03/27 PHP
PHPEXCEL 使用小记
2013/01/06 PHP
探讨捕获php错误信息方法的详解
2013/06/09 PHP
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
详解Laravel5.6 Passport实现Api接口认证
2018/07/27 PHP
jQuery数组处理方法汇总
2011/06/20 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
js+css实现select的美化效果
2016/03/24 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
微信小程序图片自适应支持多图实例详解
2017/06/21 Javascript
Vue组件通信之Bus的具体使用
2017/12/28 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
2018/07/24 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
Python解析Excle文件中的数据方法
2018/10/23 Python
Python os.rename() 重命名目录和文件的示例
2018/10/25 Python
Python字符串的修改方法实例
2019/12/19 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
土耳其家居建材网站:Koçtaş
2016/11/22 全球购物
联想香港官方网站及网店:Lenovo香港
2018/04/13 全球购物
英国在线购买马术服装:EQUUS
2019/07/12 全球购物
应届生法律顾问求职信
2013/11/19 职场文书
植树节口号
2014/06/21 职场文书
医生爱岗敬业演讲稿
2014/08/26 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
家属慰问信
2015/02/14 职场文书
2015年简历自我评价范文
2015/03/11 职场文书
求职简历自荐信怎么写
2015/03/26 职场文书
2015年七一建党节活动方案
2015/05/05 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python