用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 }

 

 

 

 

 

转载于:https://www.cnblogs.com/cutpicmanxx/p/9447974.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(base) PS F:\langchao\fl\fan_ui> cnpm install --force (node:19128) ExperimentalWarning: stream/web is an experimental feature. This feature could change at any time (Use `node --trace-warnings ...` to show where the warning was created) | [31/122] Installing through2@^4.0.0 [npminstall:get:error] GET https://registry.npmmirror.com/@types%2Fcrypto-js ConnectTimeoutError: Connect Timeout Error after 5 reties, status: -1, headers: {} [npminstall:download:npm] Request https://registry.npmmirror.com/@types%2Fcrypto-js error, use cache instead [npminstall:get:error] GET https://registry.npmmirror.com/vite-plugin-mock ConnectTimeoutError: Connect Timeout Error after 5 reties, status: -1, headers: {} \ [38/122] Installing traverse@^0.6.6 [npminstall:runscript:error] vite-plugin-imagemin@0.6.1 › imagemin-pngquant@9.0.2 › pngquant-bin@^6.0.0 run postinstall node lib/install.js error: Error: Command failed with exit code 1: node lib/install.js at makeError (C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\execa\lib\error.js:60:11) at handlePromise (C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\execa\index.js:118:26) at runMicrotasks (<anonymous>) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async Object.exports.runScript (C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\npminstall\lib\utils.js:261:12) at async runLifecycleScripts (C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\npminstall\lib\lifecycle_scripts.js:66:7) at async _install (C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\npminstall\lib\install_package.js:321:5) at async install (C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\npminstall\lib\install_package.js:23:12) at async mapper (C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\npminstall\lib\install_package.js:270:9) { shortMessage: 'Command failed with exit code 1: node lib/install.js', command: 'node lib/install.js', escapedCommand: 'node "lib/install.js"', exitCode: 1, signal: undefined, signalDescription: undefined, stdout: undefined, stderr: undefined, failed: true, timedOut: false, isCanceled: false, killed: false × Install fail! Error: run postinstall error, please remove node_modules before retry! Command failed with exit code 1: node lib/install.js Error: Command failed with exit code 1: node lib/install.js at makeError (C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\execa\lib\error.js:60:11) at handlePromise (C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\execa\index.js:118:26) at runMicrotasks (<anonymous>) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async Object.exports.runScript (C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\npminstall\lib\utils.js:261:12) at async runLifecycleScripts (C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\npminstall\lib\lifecycle_scripts.js:66:7) at async _install (C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\npminstall\lib\install_package.js:321:5) at async install (C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\npminstall\lib\install_package.js:23:12) at async mapper (C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\npminstall\lib\install_package.js:270:9) npminstall version: 7.9.0 npminstall argv: D:\Nodejs\node.exe C:\Program Files\nodejs\node_global\node_modules\cnpm\node_modules\npminstall\bin\install.js --fix-bug-versions --china --userconfig=C:\Users\Lenovo\.cnpmrc --disturl=https://cdn.npmmirror.com/binaries/node --registry=https://registry.npmmirror.com --force
07-14

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值