Skip to content

Instantly share code, notes, and snippets.

@Wxh16144
Created August 27, 2025 04:36
Show Gist options
  • Select an option

  • Save Wxh16144/1dcfdeedaa7bb556b184bc97fa9f690f to your computer and use it in GitHub Desktop.

Select an option

Save Wxh16144/1dcfdeedaa7bb556b184bc97fa9f690f to your computer and use it in GitHub Desktop.
清理 nvm 已安装 Node.js 版本,只保留每个 major 版本的最新版本(macOS bash)
#!/bin/bash
# nvm-clean-major: 清理 nvm 已安装 Node.js 版本,只保留每个 major 版本的最新版本
# 仅在 macOS + bash 环境下测试通过
RED="\033[31;1m"
GREEN="\033[32;1m"
YELLOW="\033[33;1m"
RESET="\033[0m"
function clean_nvm_versions() {
# 获取所有已安装的 Node.js 版本
local versions=($(nvm ls --no-colors | awk '/^ *v[0-9]+\.[0-9]+\.[0-9]+/ {gsub(/^ +/, "", $1); print $1}'))
# 按 major 分组,只保留每组最新的
declare -A latest_versions
for v in "${versions[@]}"; do
major=$(echo $v | cut -d. -f1 | tr -d 'v')
latest_versions[$major]=$v
done
# 需要删除的版本
to_delete=()
for v in "${versions[@]}"; do
major=$(echo $v | cut -d. -f1 | tr -d 'v')
if [[ $v != ${latest_versions[$major]} ]]; then
to_delete+=("$v")
fi
done
# 打印所有版本,红色为待删除,绿色为保留
for v in "${versions[@]}"; do
major=$(echo $v | cut -d. -f1 | tr -d 'v')
if [[ $v != ${latest_versions[$major]} ]]; then
echo -e "${RED}$v (delete)${RESET}"
else
echo -e "${GREEN}$v (keep)${RESET}"
fi
done
if (( ${#to_delete[@]} > 0 )); then
echo -en "${YELLOW}Do you want to delete the red versions above? [y/N]: ${RESET}"
read -r answer
if [[ "$answer" =~ ^[Yy]$ ]]; then
for v in "${to_delete[@]}"; do
echo -e "${YELLOW}Uninstalling $v ...${RESET}"
nvm uninstall $v
done
echo -e "${GREEN}Done.${RESET}"
else
echo -e "${RED}Aborted. No versions deleted.${RESET}"
fi
else
echo -e "${YELLOW}No versions to delete.${RESET}"
fi
}
# 用法:source nvm.sh 后执行 clean_nvm_versions
@Wxh16144
Copy link
Author

nvm-clean-major.sh

similar: nvm-sh/nvm#1195

该脚本用于批量清理 nvm 管理的 Node.js 版本,只保留每个 major 版本的最新版本。
所有待删除版本会以红色高亮,保留版本以绿色高亮,最后输入 y/n 确认是否删除。
仅在 macOS + bash 环境下测试通过,其他平台请自行验证。

before

ce5c2acef35ecf2d1f6447e90cb2e0b6

process

12f55e8fa5448bdce9cbc16d759da589

result / after

508d76ac700d7c063e911a1931faa7ba

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment