查找所有node_modules批量清理方法

平时写代码,工作目录中的node_modules会占用很大的空间有时需要清理。而直接使用Windows的删除会很慢,以下是基于PowerShell的几种删除方法

1.单条命令的方式

  • 在当前目录下执行,递归查找所有的node_modules目录递归删除
Get-ChildItem -Path . -Filter node_modules -Recurse | Remove-Item -Force -Recurse

2.简单脚本封装

  • 还是使用PowerShell的Remove-Item
  • 先查找到所有的node_modules路径然后计算大小,最后用户确认删除的同时计算删除时间
# 查询指定路径下的所有node_modules路径
function Find-TargetDirectories {
    param (
        [Parameter(Mandatory = $true)]
        [string]$Path
    )
    $directories = Get-ChildItem -Path $Path -Directory
    foreach ($directory in $directories) {
        if ($directory.Name -eq "node_modules") {
            Write-Output $directory.FullName
        }
        else {
            Find-TargetDirectories -Path $directory.FullName
        }
    }
}

# 打印所有路径和大小
$dirs = Find-TargetDirectories -Path (Get-Location)
Write-Host "The following path will be deleted:"
$fso = New-Object -ComObject Scripting.FileSystemObject
$dirs | ForEach-Object {
    $dir_size = ($fso.GetFolder($_).Size/1MB).ToString("F2") + "MB"
    Write-Host "Size: $dir_size Path: $_"
}

# 用户确认
$continue = Read-Host "Do you want to continue with the deletion operation? (Y/N)"
if ($continue -eq "N") {
    Write-Host "The deletion operation has been canceled."
    exit
}

# 开始删除
$start_time = (Get-Date)
foreach ($dir in $dirs) {
    Remove-Item -Path $dir -Recurse -Force
}
$total_time = (New-TimeSpan $start_time).totalseconds.ToString("F2")
Write-Host "Delete completed, time taken: $total_time s"

3.使用robocopy

  • 有人说在像PowerShell这样的解释性语言中重新发明轮子会比本地已有的实现慢。然后推荐了robocopy。
  • Robocopy是Windows中自带的一个复制工具,但也可以用来删除文件。
  • 原理是使用它的/mir镜像目录树命令,通过把一个空目录镜像到指定要删除的目录位置,那个目录的所有内容将会删除。
# 查询指定路径下的所有node_modules路径
function Find-TargetDirectories {
    param (
        [Parameter(Mandatory = $true)]
        [string]$Path
    )
    $directories = Get-ChildItem -Path $Path -Directory
    foreach ($directory in $directories) {
        if ($directory.Name -eq "node_modules") {
            Write-Output $directory.FullName
        }
        else {
            Find-TargetDirectories -Path $directory.FullName
        }
    }
}

# 在TEMP目录下生成待创建空文件夹名称
function GetRandomTempPath {
    Do {
        $randomFileName = [System.IO.Path]::GetRandomFileName()
        $fullPath = Join-Path -Path $env:TEMP -ChildPath $randomFileName
    } While (Test-Path $fullPath);
    Return $fullPath;
} 


# 打印所有路径和大小
$dirs = Find-TargetDirectories -Path (Get-Location)
Write-Host "The following path will be deleted:"
$fso = New-Object -ComObject Scripting.FileSystemObject
$dirs | ForEach-Object {
    $dir_size = ($fso.GetFolder($_).Size / 1MB).ToString("F2") + "MB"
    Write-Host "Size: $dir_size Path: $_"
}

# 用户确认
$continue = Read-Host "Do you want to continue with the deletion operation? (Y/N)"
if ($continue -eq "N") {
    Write-Host "The deletion operation has been canceled."
    exit
}

# 创建空文件夹
$emptyDir = GetRandomTempPath
mkdir $emptyDir | Out-Null

# 开始删除
$start_time = (Get-Date)
foreach ($dir in $dirs) {
    robocopy /mir $emptyDir $dir /MT:32 | Out-Null
    Remove-Item -Path $dir
}
Remove-Item -Path $emptyDir
$total_time = (New-TimeSpan $start_time).totalseconds.ToString("F2")
Write-Host "Delete completed, time taken: $total_time s"

4.使用.NET的方法

  • 还有一种方法是,让PowerShell使用.NET的方法进行文件和文件夹操作,据说可能比等效的PowerShell命令更快。
  • 以下使用System.IO.Directory中的Delete(String,Boolean)方法递归删除指定目录路径的所有内容。
# 查询指定路径下的所有node_modules路径
function Find-TargetDirectories {
    param (
        [Parameter(Mandatory = $true)]
        [string]$Path
    )
    $directories = Get-ChildItem -Path $Path -Directory
    foreach ($directory in $directories) {
        if ($directory.Name -eq "node_modules") {
            Write-Output $directory.FullName
        }
        else {
            Find-TargetDirectories -Path $directory.FullName
        }
    }
}

# 打印所有路径和大小
$dirs = Find-TargetDirectories -Path (Get-Location)
Write-Host "The following path will be deleted:"
$fso = New-Object -ComObject Scripting.FileSystemObject
$dirs | ForEach-Object {
    $dir_size = ($fso.GetFolder($_).Size / 1MB).ToString("F2") + "MB"
    Write-Host "Size: $dir_size Path: $_"
}

# 用户确认
$continue = Read-Host "Do you want to continue with the deletion operation? (Y/N)"
if ($continue -eq "N") {
    Write-Host "The deletion operation has been canceled."
    exit
}

# 开始删除
$start_time = (Get-Date)
foreach ($dir in $dirs) {
    [System.IO.Directory]::Delete($dir, $true)
}
$total_time = (New-TimeSpan $start_time).totalseconds.ToString("F2")
Write-Host "Delete completed, time taken: $total_time s"
  • 简单测试:我复制了3个相同大小的前端项目分别使用3种方法清理,结果是最后这个方法最快。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
这个错误提示表明在执行 `npm install` 命令时发生了权限问题,导致无法重命名文件或目录。 可能的原因是当前用户没有足够的权限来修改文件或目录,或者文件或目录被其他程序占用。解决此问题的方法如下: 1. 以管理员身份运行命令提示符或 PowerShell。在 Windows 上,你可以右键单击“命令提示符”或“PowerShell”,然后选择“以管理员身份运行”。 2. 检查是否有其他程序正在使用被占用的文件或目录。你可以尝试关闭其他程序,或者等待它们完成操作后再执行 `npm install` 命令。 3. 如果你使用了防病毒软件或安全软件,请尝试临时禁用它们,然后再执行 `npm install` 命令。 4. 如果上述方法都无法解决问题,请尝试在命令行中手动执行重命名操作。例如,如果出错的文件是 `D:\node-v14.21.3-win-x64\node_global\node_modules\cnpm\node_modules\npm\node_modules\.node-gyp.DELETE\node_modules\@npmcli`,则可以尝试使用以下命令进行重命名: ``` move D:\node-v14.21.3-win-x64\node_global\node_modules\cnpm\node_modules\npm\node_modules\.node-gyp.DELETE\node_modules\@npmcli D:\node-v14.21.3-win-x64\node_global\node_modules\cnpm\node_modules\npm\node_modules\node-gyp\node_modules\@npmcli ``` 这个命令将 `.node-gyp.DELETE` 目录下的 `@npmcli` 目录重命名为 `node-gyp` 目录下的 `@npmcli` 目录。如果操作成功,你应该可以重新执行 `npm install` 命令了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dihw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值