使用node構建文件重命名腳本工具

  node對於先後端開發人員來講已經並不陌生了,對於前端小白來講,node更是高高在上,雖然同是JavaScript,可是node的學習路線仍是蠻陡峭的,對於初出茅廬的程序員或許很難學的進去,可是學習仍是要學,若是是帶着問題去學習,或許就不會那麼枯燥,學習起來也會事半功倍。 
  今天就就帶着一個問題來看看,node是如何幫助程序員快速解決問題的。
  首先,問題以下:工做上要處理大量圖片,設計師給個人是中文命名的圖片,衆所周知,中文在程序中可能會出現亂碼,因此我須要把中文名字改爲英文;   前端

因爲圖片量很大,一個一個手動去改,真是累死。懶癌末期的我怎麼可能一個一個手動的去改呢,因而就想有沒有批量修改文件名的工具呢?萬能的百度告訴我,還真有,心急如焚的我馬上下載使用,但是這些個軟件竟然是收費的,免費用戶只能一次處理幾張圖片,這可不是我須要的。靜下來想想,不如本身寫個腳本工具,一次搞定全部問題,好,說幹就幹!
  既然需求核心是修改文件名,首先想到的是使用node,node的fs模塊就是用來和文件系統交互的。接下來就看看如何使用node的fs模塊實現批量修改文件名。
  首先保證你本地已經安裝了node,新建一個js文件,在文件頭部引入fs模塊;

const fs = require('fs');
複製代碼

這裏主要使用了fs的兩個api:fs.readdirfs.rename,fs.readdir(path,[callback(err,files)])會讀取目錄下的全部文件,path是路徑參數,回調函數有兩個參數,err是錯誤信息,files是讀取成功時的文件的集合,是一個數組;fs.rename(oldPath, newPath, [callback(err)])重命名文件,三個參數分別是原路徑、新路徑和回調函數;
  設計在命令行中輸入形如 "奧迪-audi"的參數,把文件名中的「奧迪」轉換成「audi」。這就須要再命令行輸入額外的參數。經過node的全局process.argv參數獲取。須要注意的是,process.argv返回命令行腳本的各個參數組成的數組:
  node

$ node rename 奧迪-audi
複製代碼

返回結果是:程序員

[ 
  'C:\\Program Files\\nodejs\\node.exe',
  'D:\\test_projects\\rename',
  '奧迪-audi' 
]
複製代碼

能夠看出,返回的結果是一個數組,前兩個元素是node的路徑和js文件的路徑,第三個元素纔是真正須要的參數,因此使用時只提取第三個元素便可;而後傳入這個參數,把讀取的文件名按照這個規則重命名後導出。下邊貼出代碼:正則表達式

const fs = require('fs');
let path = './';
let str = process.argv[2];  //獲取輸入的參數

/**
  替換函數
  filename -- 須要替換的文件名稱
  str -- 替換規則,由命令行輸入得到
**/
function replaceName(filename,str){
	str = str.split('-');
	let re = RegExp(str[0],'g');    //利用正則替換參數
	let newname = filename.replace(re,str[1]);
	return newname;
};

//讀取文件目錄內容
fs.readdir(path,(err,files)=>{
	files = files.filter(element=>element.split('.')[1]==='jpg');  //過濾圖片文件
	files.map(filename=>{
		let oldPath = path + filename;
		let newPath = path + replaceName(filename,str);

		fs.rename(oldPath,newPath,(err)=>{
			if(!err){
				console.log(filename + ' is done');
			}
		})
	});
})
複製代碼

  以上即是所有代碼,很是簡單。將重命名的代碼封裝成函數,在讀取到文件時循環調用該函數重命名文件,最後導出到原路徑覆蓋原文件。
  以上有一點須要注意,在replaceName函數中使用了正則表達式,這樣能夠完整準確的把全部同名字段替換掉,若是直接在正則表達式中加入替換的變量是不起做用的,正則會把變量看成表達式的一部分解析,在一番查詢後,能夠新建正則對象,在正則對象中是能夠傳入參數的,這樣就實現了在正則表達式中加入參數的目的了。使用時,命令行進入圖片所在目錄,在命令行輸入如下命令,回車執行,就會把全部文件名中的奧迪字段替換成audi。後端

$ node 文件路徑\\rename 奧迪-audi
複製代碼

總結

代碼結構很是簡單,知識點有api

  • fs.readdir讀取目錄下文件
  • fs.rename重命名文件
  • 命令行參數獲取
  • 正則表達式如何添加參數
相關文章
相關標籤/搜索