【VSCode】一键清理旧版本插件脚本(Mac或者Windows都可)
文章目录
- 清理VSCode旧版本插件
- 为什么会有旧版本插件
- Mac 环境
- 脚本源码
- 原理解释
- 实例解释
- Windows 环境
清理VSCode旧版本插件
为什么会有旧版本插件
vscode 插件经常需要更新的,有时候更新之后旧版本的插件还是会留存在插件文件夹中(更新插件之后vscode并不会删除旧版本插件),路径一般是.vsode/extensions
,如果插件很多,也经常更新就会出现很多旧版本的插件不断留存在插件文件夹中,这有点占存储,其实说到底 vscode 在更新插件之后存在一点瑕疵——没有删除老版本插件
Mac 环境
脚本源码
#!/bin/bash
EXTENSIONS_DIR="$HOME/.vscode/extensions"
EXTENSIONS_DIR="$HOME/Desktop/DCTG/test"
if [ -d "$EXTENSIONS_DIR" ]; then
cd "$EXTENSIONS_DIR" || exit
# 查找所有插件,按发布者和插件名分组
find . -maxdepth 1 -type d -name "*.*" | sed 's/\.\///' | while read -r dir; do
# 提取插件名称部分(发布者.插件名)
# echo "### check dir ### $dir"
plugin=$(echo "$dir" | sed -E 's/(-[0-9]+\.[0-9]+(\.[0-9]+)?(-.*)?)$//')
# echo "### check plugin ### $plugin"
if [ "$plugin" = "." ]; then
continue
fi
# 查找该插件的所有版本,并按版本号排序
versions=$(find . -maxdepth 1 -type d | grep -E "$plugin-[0-9]+\.[0-9]+\.[0-9]+" | sed 's/\.\///' | sort -Vr)
# 如果有多于一个版本,则删除旧版本
if [ "$(echo "$versions" | wc -l)" -gt 1 ]; then
echo "Cleaning up old versions of $plugin ..."
echo "$versions" | tail -n +2 | xargs rm -rf
echo "Done."
fi
done
else
echo "VSCode extensions directory not found: $EXTENSIONS_DIR"
fi
原理解释
- 首先 find 所有文件夹:
find . -maxdepth 1 -type d -name "*.*" | sed 's/\.\///' | while read -r dir;
- 其次提取
[发布者].[插件名].[版本]
中的[发布者].[插件名]
:plugin=$(echo "$dir" | sed -E 's/(-[0-9]+\.[0-9]+(\.[0-9]+)?(-.*)?)$//')
- 再次查找该插件的所有版本并逆序排一下:
versions=$(find . -maxdepth 1 -type d | grep -E "$plugin-[0-9]+\.[0-9]+\.[0-9]+" | sed 's/\.\///' | sort -Vr)
- 删除旧版本插件文件夹:
echo "$versions" | tail -n +2 | xargs rm -rf
实例解释
举个例子,假设插件文件夹下面有如下文件夹:
github.copilot-chat-0.24.0
github.copilot-chat-0.24.1
github.copilot-chat-0.24.2
- 第一步和第二步处理之后得到
plugin = github.copilot-chat
- 第三步处理之后得到逆序
github.copilot-chat-0.24.2 github.copilot-chat-0.24.1 github.copilot-chat-0.24.0
- 第四步处理:
echo "$versions" | tail -n +2
github.copilot-chat-0.24.1 github.copilot-chat-0.24.0
xargs rm -rf
直接删除 0.24.0 和 0.24.1
Windows 环境
没测试过,通过 deepseek 转换 bash 脚本生成
@echo off
setlocal enabledelayedexpansion
:: 设置 VSCode 扩展目录
set "EXTENSIONS_DIR=%USERPROFILE%\.vscode\extensions"
:: 检查目录是否存在
if not exist "%EXTENSIONS_DIR%" (
echo VSCode extensions directory not found: %EXTENSIONS_DIR%
exit /b 1
)
:: 遍历所有插件目录
cd /d "%EXTENSIONS_DIR%"
for /d %%d in (*.*) do (
set "dir=%%d"
:: 提取插件名称(去掉版本号)
for /f "tokens=1,2 delims=-" %%a in ("!dir!") do (
set "plugin=%%a"
set "version=%%b"
)
:: 跳过无效目录
if "!plugin!"=="" (
echo Skipping invalid directory: !dir!
goto :next
)
:: 查找该插件的所有版本
set "versions="
for /f "delims=" %%v in ('dir /b /ad "!plugin!-*" ^| findstr /r /c:"^!plugin!-[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"') do (
set "versions=!versions!%%v"$REMOVE$
)
:: 按版本号排序(降序)
set "sorted="
for /f "tokens=1* delims=." %%a in ('(for %%v in (!versions!) do @echo %%v^) ^| sort /r') do (
set "sorted=!sorted!%%a.%%b "
)
:: 删除旧版本
set "count=0"
for %%v in (!sorted!) do (
set /a "count+=1"
if !count! gtr 1 (
echo Deleting old version: %%v
rmdir /s /q "%%v"
)
)
:next
)
echo Cleanup completed.
endlocal