使用node構建檔案重新命名指令碼工具

彩虹棒棒糖發表於2018-09-13

  node對於前後端開發人員來說已經並不陌生了,對於前端小白來說,node更是高高在上,雖然同是JavaScript,但是node的學習路線還是蠻陡峭的,對於初出茅廬的程式設計師或許很難學的進去,但是學習還是要學,如果是帶著問題去學習,或許就不會那麼枯燥,學習起來也會事半功倍。 
  今天就就帶著一個問題來看看,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 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
複製程式碼

總結

程式碼結構非常簡單,知識點有

  • fs.readdir讀取目錄下檔案
  • fs.rename重新命名檔案
  • 命令列引數獲取
  • 正規表示式如何新增引數

相關文章