用nodejs寫一個刪除 node_modules 的腳本


離職的時候,需要把寫的項目拷走,但是每個項目下都有node_modules,這文件非常大,當然要刪除再帶走,本來想寫shell腳本,但一想不是每次開發都有mac,所以用node寫,網上找了些代碼再經過自己的改良

node 的刪除 有兩種 一種是刪除文件 unlinkSync(sync代表這是同步操作) 一種是刪除目錄  rmdirSync,但是刪除目錄有要求,必須是空目錄才能刪除,所以我們寫一個刪除目錄的函數

 1 function deleteFolder(path) {
 2     var files = [];
 3     if( fs.existsSync(path) ) {  // 查看這個路徑是否存在
 4         files = fs.readdirSync(path);  //  讀取一個目錄的內容 返回不包含'.' '.' 的文件名的數組(其實會包含)
 5         files.forEach(function(file,index){
 6             var curPath = path + "/" + file;
 7             //  本來網上是statSync 我給改成了 lstatSync
 8             if(fs.lstatSync(curPath).isDirectory()) {  // 判斷是否是文件夾
 9                 deleteFolder(curPath);
10             } else {
11                 fs.unlinkSync(curPath);
12             }
13         });
14         fs.rmdirSync(path);
15     }
16 }

為什么改成lstatSync 因為我發現有些文件(懷疑可能是yarn安裝的,好像npm安裝的就沒有這個問題)在使用fs.statSync時會報錯,返回 

但是我使用fs.statSync的時候就不會,這時候當然是去查文檔,但是文檔給的解釋是這樣的這就陷入難題了。(fstatSync是用不了的,因為傳的參賽是文件描述符,我的需求是傳文件路徑,所以符合我需求的就是stat和lstat)

然后又查到了c語言的 stat 和 lstat的區別 當文件是一個符號鏈接時,lstat返回的是該符號鏈接本身的信息;而stat返回的是該鏈接指向的文件的信息。(似乎有些暈吧,這樣記,lstat比stat多了一個l,因此它是有本事處理符號鏈接文件的,因此當遇到符號鏈接文件時,lstat當然不會放過。而 stat系統調用沒有這個本事,它只能對符號鏈接文件睜一只眼閉一只眼,直接去處理鏈接所指文件嘍)

我打開了那個stat會報錯的“文件”確實是一個符號鏈接,由於stat不能處理符號鏈接,而直接去找鏈接所指文件,但是我的需求只是把這個符號鏈接給刪掉就行了,不需找到他指的文件,當然他這個報錯,我猜測是本來能返回的是一個文件的status,但是結果還是返回了一個鏈接,於是報了既不是文件也不是文件夾的錯,當然這是c語言里面的,而node的底層是c++,在極客學院的文檔里對這個stat和lastat的說明也和c語言的類似,說明這個c語言的區別也可以用到node里來解釋。

 

能刪除文件夾之后  接下來當然是找到目標  如果找到目標文件 就刪除 找不到繼續遞歸找

完整代碼是

 1 const fs = require('fs');
 2 
 3 const delTargetDir = 'node_modules'
 4 
 5 const enterTargetDir = '總目錄'
 6 
 7 deleteTargetFolder(enterTargetDir, delTargetDir)
 8 
 9 function deleteTargetFolder(path, target) {
10   var files = []
11   if (fs.existsSync(path)) {
12     files = fs.readdirSync(path)
13     files.forEach(function(file,index){
14         var curPath = path + "/" + file;
15         if (fs.lstatSync(curPath).isDirectory()) { // 同下邊 都改成lstatSync
16           if (file === target) {
17             deleteFolder(curPath)
18           } else {
19             deleteTargetFolder(curPath, target)
20           }
21         }
22     })
23   }
24 }
25 
26 function deleteFolder(path) {
27     var files = [];
28     if( fs.existsSync(path) ) {
29         files = fs.readdirSync(path);
30         files.forEach(function(file,index){
31             var curPath = path + "/" + file;
32             //  本來網上是statSync 我給改成了 lstatSync
33             if(fs.lstatSync(curPath).isDirectory()) {
34                 deleteFolder(curPath);
35             } else {
36                 fs.unlinkSync(curPath);
37             }
38         });
39         fs.rmdirSync(path);
40     }
41 }

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM