用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.statSync(curPath).isDirectory()) {
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 }

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "Andale Mono"; color: #28fe14; background-color: rgba(0, 0, 0, 0.9) }
span.s1 { }

原文地址:https://www.cnblogs.com/cutpicmanxx/p/9447974.html

时间: 2024-08-29 13:48:12

用nodejs写一个删除 node_modules 的脚本的相关文章

python写一个乘法表的脚本

学习脚本的时候经常会被问到会不会写一个99乘法表,现在就用python语句简单写一个乘法表 [[email protected] python_py]# cat while3.py i = 1 while (i<=9):        j=1        while(j<=i):               printj,"x",i,"=",j*i,"\t",               j=j+1        print&quo

写一个简单的python脚本来返回ip地址的掩码,子网个数等

如果我们想快速得到一个IP地址段有多少个ip,快速得到IP地址段的子网掩码,或者快速得到一个IP地址的二进制,那么可以来学习一下.本文利用python的一个IP分析模块IPy实现,首先安装IPy模块 wget https://pypi.python.org/packages/88/28/79162bfc351a3f1ab44d663ab3f03fb495806fdb592170990a1568ffbf63/IPy-0.83.tar.gz tar -xf IPy-0.83.tar.gz cd IP

使用python写一个监控mysql的脚本,在zabbix web上自定义模板

##先使用MySQLdb的接口关联数据库. [[email protected] python]# cat check_Mysql_custom.py #!/usr/local/bin/python '''author = chenmingle''' '''Description:get mysql status''' import os import sys try:     import MySQLdb as mysql except Exception, e:     print e   

自动化运维:(3)写一个简单的Shell脚本(案例)

一.需求 1.test.sh 脚本执行时候需要添加参数才能执行 参数和功能详情如下: 参数 执行效果 start 启动中... stop 关闭中... restart 重启中... * 脚本帮助信息... 2.参数的数量有限制,只能是1个,多余一个会提示脚本的帮助信息 3.帮助信息使用函数来实现 信息内容:脚本 test.sh 使用方式: test.sh [ start|stop|restart ] 二.知识点分析 1.zonghe.sh 脚本执行时候需要添加参数才能执行 脚本传参.case语句

利用python Socket写一个类似FTP的脚本(只写了下载,上传和下载差不多就不多写了)

Socket的介绍就不多说了,网上都能搜到,直接说脚本,要实现FTP的功能要有服务器端和客户端, 服务器端: import SocketServer import commands import time class MySockServer(SocketServer.BaseRequestHandler):     def handle(self):         print "Got a new conn from", self.client_address         wh

bat想要写一个卸载软件的脚本,最后宣布失败[未完待续...]

find 的用法:双引号,搜索内容是英文也要用双引号 C:\Users\clouder\Desktop\yanna>find '小智' products.txt FIND: 参数格式不正确 C:\Users\clouder\Desktop\yanna>find "小智" products.txt ---------- PRODUCTS.TXT 0 亦云小智 亦云小智 {4CE4A510-3639-4F21-9E87-E33D6912DCD6} 20190307 C:\pow

写一个备份文件的python脚本

#!/usr/bin/env python #-*- coding:utf-8 -*- import os import zipfile import time start_Dir = '/home/dragon/python/'   #需要压缩的文件或目录路径 List_1 = ['.git',  '.svn','temp']   #不需要备份的目录 target_zip = '/home/dragon/'   #压缩文件存放位置 Times = time.strftime('%Y%m%d%H

用nodejs做一个svn密码修改页面

linux上配置好svn后,管理修改密码还得去手工修改passwd这个文件,太麻烦,其实网上应该有配套的web管理修改界面.但我想自己用nodejs写一个,因为用node不用配置复杂的服务器. 弄这种基于事件模型的语言,一定要小心,整个过程可能不是线性的. 1 var http = require("http"); 2 var fs = require('fs'); 3 var url = require('url'); 4 var query = require('querystri

Linux系统的rm命令太危险,一不小心就会删除系统文件。写一个shell脚本来替换系统的rm命令,

Linux系统的rm命令太危险,一不小心就会删除系统文件.写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时都要做一个备份,然后再删除. 假设有一个大的分区/data/,每次删除文件或者目录前,都要在/data/下面创建一个隐藏目录,以日期/时间命名,比如/data/.201802021054,然后把所有删除的文件同步到该目录下面,可以使用rsync -R把文件路径一同同步 答案: #!/bin/bash d=`date +%Y%m%d%H%M` read -p "Are y