node文件批量重命名的方法示例
在一個(gè)實(shí)際需求中,需要對一批文件(如:文本、圖片)進(jìn)行重命名,按照數(shù)字編號(hào)。正好借此熟悉了一下node的fs文件操作,寫了一個(gè)批量修改文件名的腳本。
需求
現(xiàn)有以下圖片文件

需要批量修改文件名稱,變?yōu)榻y(tǒng)一前綴名稱并且自增索引,修改后效果

最簡單的人力操作就是逐個(gè)文件重命名,但本著DRY(Don't repeat yourself)原則,還是寫一個(gè)node腳本搞定。
研究
node中要進(jìn)行文件操作需要了解一下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);
異步讀取文件參數(shù):文件路徑,編碼方式,回調(diào)函數(shù)
寫入文件
fs.writeFile('test2.txt', 'this is text', { 'flag': 'w' }, err => {
if (err) {
throw err;
}
console.log('saved');
});
寫入文件參數(shù):目標(biāo)文件,寫入內(nèi)容,寫入形式,回調(diào)函數(shù)
flag寫入方式:
r:讀取文件
w:寫文件
a:追加
創(chuàng)建目錄
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為目錄下的文件或目錄名稱數(shù)組
獲取文件信息
fs.stat('test.txt', (err, stats)=> {
console.log(stats.isFile()); //true
})
獲取文件信息后stats方法:
| 方法 | 說明 |
|---|---|
| stats.isFile() | 是否為文件 |
| stats.isDirectory() | 是否為目錄 |
| stats.isBlockDevice() | 是否為塊設(shè)備 |
| stats.isCharacterDevice() | 是否為字符設(shè)備 |
| stats.isSymbolicLink() | 是否為軟鏈接 |
| stats.isFIFO() | 是否為UNIX FIFO命令管道 |
| stats.isSocket() | 是否為Socket |
創(chuàng)建讀取流
let stream = fs.createReadStream('test.txt');
創(chuàng)建寫入流
let stream = fs.createWriteStreamr('test_copy.txt');
開發(fā)
開發(fā)思路:
- 讀取源目錄
- 判讀存放目錄是否存在,不存在時(shí)新建目錄
- 復(fù)制文件
- 判斷復(fù)制內(nèi)容是否為文件
- 創(chuàng)建讀取流
- 創(chuàng)建寫入流
- 鏈接管道,寫入文件內(nèi)容
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 文件目標(biāo)\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++;
})
}
效果

總結(jié)
node提供了很多模塊可以幫助我們完成不同需求的功能開發(fā),使javascript不僅僅局限與瀏覽器中,嘗試自己編寫一些腳本有助于對這些模塊的理解,同時(shí)也能提高辦公效率。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
nodeJS?express路由學(xué)習(xí)req.body與req.query方法實(shí)例詳解
這篇文章主要為大家介紹了nodeJS?express路由學(xué)習(xí)req.body與req.query方法實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Express + Node.js實(shí)現(xiàn)登錄攔截器的實(shí)例代碼
本篇文章主要介紹了Express + Node.js實(shí)現(xiàn)攔截器的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07
如何利用node.js開發(fā)一個(gè)生成逐幀動(dòng)畫的小工具
這篇文章主要給大家介紹了關(guān)于如何利用node.js開發(fā)一個(gè)生成逐幀動(dòng)畫小工具的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用node.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
了不起的node.js讀書筆記之mongodb數(shù)據(jù)庫交互
這篇文章主要介紹了了不起的node.js讀書筆記之mongodb數(shù)據(jù)庫交互,需要的朋友可以參考下2014-12-12
Nodejs搭建多進(jìn)程Web服務(wù)器實(shí)現(xiàn)過程
這篇文章主要為大家介紹了Nodejs搭建多進(jìn)程Web服務(wù)器實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Node.js開發(fā)者必須了解的4個(gè)JS要點(diǎn)
這篇文章主要介紹了Node.js開發(fā)者必須了解的4個(gè)JS要點(diǎn),Node.js是一個(gè)面向服務(wù)器的框架,立足于Chrome強(qiáng)大的V8 JS引擎。盡管它由C++編寫而成,但是它及其應(yīng)用是運(yùn)行在JS上的,需要的朋友可以參考下2016-02-02
基于NodeJS的前后端分離的思考與實(shí)踐(一)全棧式開發(fā)
這個(gè)話題最近被討論得比較多,阿里有些BU也在進(jìn)行一些嘗試。討論了很久之后,我們團(tuán)隊(duì)決定探索一套基于NodeJS的前后端分離方案,過程中有一些不斷變化的認(rèn)識(shí)以及思考,記錄在這里,也希望看到的同學(xué)參與討論,幫我們完善。2014-09-09
nvm版本導(dǎo)致npm?install報(bào)錯(cuò)Unexpected?token?'.'的解決辦法
最近做項(xiàng)目遇到npm install 的問題,下面這篇文章主要給大家介紹了關(guān)于nvm版本導(dǎo)致npm?install報(bào)錯(cuò)Unexpected?token?'.'的解決辦法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07

