11#! /bin/bash
22
3+ # === 配置 ===
34LOG_FILE=" /var/log/icon_replace_$( date +%Y%m%d_%H%M%S) .log"
45TARGET_DIR=" /ugreen/static/icons"
56REPO_MAIN=" https://github.com/zeyu8023/ugreen-icon-replacer"
@@ -8,14 +9,46 @@ ZIP_PATH="/archive/refs/heads/main.zip"
89ZIP_FILE=" icons.zip"
910CONFIG_FILE=" $HOME /.ugreen_icon_config"
1011
11- echo " 请选择图标来源:"
12- echo " 1) 使用 GitHub 项目中的图标(推荐)"
13- echo " 2) 使用本地图标目录"
14- read -p " 请输入数字 [1/2]:" SOURCE_CHOICE
12+ # 🗃️ 缓存配置
13+ CACHE_DIR=" ${UGREEN_ICON_CACHE_DIR:- $HOME / .ugreen_icon_cache} "
14+ CACHE_ZIP=" $CACHE_DIR /main.zip"
15+ CACHE_TIMESTAMP=" $CACHE_DIR /main.zip.timestamp"
16+
17+ # === 主功能菜单 ===
18+ echo " 🧩 请选择操作功能:"
19+ echo " 1) 从 GitHub 下载并替换图标"
20+ echo " 2) 使用本地图标目录替换图标"
21+ echo " 3) 清理图标缓存目录(当前缓存:$( du -sh " $CACHE_DIR " 2> /dev/null | cut -f1 || echo 0B) )"
22+ echo " 4) 退出程序"
23+ read -p " 请输入数字 [1-4]:" MENU_CHOICE
24+
25+ case " $MENU_CHOICE " in
26+ 1) SOURCE_CHOICE=" 1" ;;
27+ 2) SOURCE_CHOICE=" 2" ;;
28+ 3)
29+ if [[ -d " $CACHE_DIR " ]]; then
30+ SIZE=$( du -sh " $CACHE_DIR " 2> /dev/null | cut -f1)
31+ echo " 🧺 当前缓存大小:$SIZE "
32+ read -p " 是否确认清空缓存目录?(y/n): " CONFIRM
33+ if [[ " $CONFIRM " =~ ^[yY]$ ]]; then
34+ rm -rf " $CACHE_DIR "
35+ echo " ✅ 缓存已清空。"
36+ else
37+ echo " 🚫 已取消清理操作。"
38+ fi
39+ else
40+ echo " 📁 当前无缓存,无需清理。"
41+ fi
42+ exit 0
43+ ;;
44+ 4) echo " 👋 程序已退出。" ; exit 0 ;;
45+ * ) echo " ❌ 输入无效,程序已退出。" ; exit 1 ;;
46+ esac
1547
48+ # === 图标来源选择 ===
1649if [[ " $SOURCE_CHOICE " == " 1" ]]; then
1750 echo " 🎨 请选择图标风格:"
18- echo " 1) iOS 26 液态玻璃(乐小宇制作 )"
51+ echo " 1) iOS 26 液态玻璃(乐小宇 )"
1952 echo " 2) 锤子 OS(Sunny 整理)"
2053 echo " 3) 拟物毛玻璃(Sunny 制作)"
2154 echo " 4) 绿联毛玻璃(Sunny 制作)"
@@ -34,54 +67,63 @@ if [[ "$SOURCE_CHOICE" == "1" ]]; then
3467 mkdir -p " $TMP_DIR "
3568 cd " $TMP_DIR " || exit 1
3669
37- echo " 🌐 正在尝试从主站下载 ZIP 包..."
38- curl -sL --max-time 10 " $REPO_MAIN$ZIP_PATH " -o " $ZIP_FILE "
39- if [[ $? -ne 0 || ! -s " $ZIP_FILE " ]]; then
40- echo " ⚠️ 主站失败,尝试镜像源..."
41- curl -sL --max-time 20 " $REPO_MIRROR$ZIP_PATH " -o " $ZIP_FILE "
42- fi
70+ mkdir -p " $CACHE_DIR "
71+ USE_CACHE=false
4372
44- if [[ $? -ne 0 || ! -s " $ZIP_FILE " ]]; then
45- echo " ⚠️ 下载失败,可能网络受限或 GitHub 被阻断。"
73+ if [[ -f " $CACHE_ZIP " ]]; then
74+ echo " 💡 检测到缓存:$CACHE_ZIP "
75+ read -p " 是否使用本地缓存图标包?(y/n): " USE_CACHE_ANSWER
76+ if [[ " $USE_CACHE_ANSWER " =~ ^[yY]$ ]]; then
77+ USE_CACHE=true
78+ cp " $CACHE_ZIP " " $ZIP_FILE "
79+ fi
80+ fi
4681
47- [[ -f " $CONFIG_FILE " ]] && LAST_PROXY=$( grep " ^proxy=" " $CONFIG_FILE " | cut -d ' =' -f2)
82+ if [[ " $USE_CACHE " == false ]]; then
83+ echo " 🌐 正在下载 ZIP 包..."
84+ curl -sL --max-time 20 " $REPO_MAIN$ZIP_PATH " -o " $CACHE_ZIP "
85+ if [[ $? -ne 0 || ! -s " $CACHE_ZIP " ]]; then
86+ echo " ⚠️ 主站失败,尝试镜像源..."
87+ curl -sL --max-time 20 " $REPO_MIRROR$ZIP_PATH " -o " $CACHE_ZIP "
88+ fi
4889
49- while true ; do
50- if [[ -n " $LAST_PROXY " ]]; then
51- echo " 🧩 检测到上次使用的代理:$LAST_PROXY "
52- read -p " 是否继续使用该代理?(y/n): " USE_LAST
53- if [[ " $USE_LAST " =~ ^[yY]$ ]]; then
54- PROXY=" $LAST_PROXY "
90+ if [[ $? -ne 0 || ! -s " $CACHE_ZIP " ]]; then
91+ [[ -f " $CONFIG_FILE " ]] && LAST_PROXY=$( grep " ^proxy=" " $CONFIG_FILE " | cut -d ' =' -f2)
92+ while true ; do
93+ if [[ -n " $LAST_PROXY " ]]; then
94+ echo " 🧩 上次代理:$LAST_PROXY "
95+ read -p " 是否复用该代理?(y/n): " USE_LAST
96+ [[ " $USE_LAST " =~ ^[yY]$ ]] && PROXY=" $LAST_PROXY "
5597 fi
56- fi
5798
58- while [[ -z " $PROXY " ]]; do
59- read -p " 🌐 请输入代理地址(如 http://127.0.0.1:7890,留空取消): " PROXY
60- [[ -z " $PROXY " ]] && echo " 🚫 未输入代理地址,已退出。" && exit 1
61- [[ " $PROXY " =~ ^(http| socks5h):// ]] || { echo " ⚠️ 格式无效,请重新输入。" ; PROXY=" " ; }
99+ while [[ -z " $PROXY " ]]; do
100+ read -p " 🌐 输入代理地址(http://127.0.0.1:7890): " PROXY
101+ [[ -z " $PROXY " ]] && echo " 🚫 未输入,退出。" && exit 1
102+ [[ " $PROXY " =~ ^(http| socks5h):// ]] || { echo " ⚠️ 格式无效" ; PROXY=" " ; }
103+ done
104+
105+ echo " 🔁 使用代理 $PROXY 下载..."
106+ curl -x " $PROXY " -sL --max-time 30 " $REPO_MAIN$ZIP_PATH " -o " $CACHE_ZIP "
107+ if [[ $? -eq 0 && -s " $CACHE_ZIP " ]]; then
108+ echo " ✅ 下载成功"
109+ echo " proxy=$PROXY " > " $CONFIG_FILE "
110+ break
111+ else
112+ echo " ❌ 下载失败。"
113+ read -p " 重试输入代理地址?(y/n): " RETRY
114+ [[ " $RETRY " =~ ^[yY]$ ]] || exit 1
115+ PROXY=" "
116+ fi
62117 done
63-
64- echo " 🔁 使用代理 $PROXY 下载..."
65- curl -x " $PROXY " -sL --max-time 30 " $REPO_MAIN$ZIP_PATH " -o " $ZIP_FILE "
66- if [[ $? -eq 0 && -s " $ZIP_FILE " ]]; then
67- echo " ✅ 下载成功,保存代理地址..."
68- echo " proxy=$PROXY " > " $CONFIG_FILE "
69- break
70- else
71- echo " ❌ 下载失败,请确认代理是否可用。"
72- read -p " 是否重新输入代理地址?(y/n): " RETRY
73- [[ " $RETRY " =~ ^[yY]$ ]] || exit 1
74- PROXY=" "
75- fi
76- done
77- else
78- echo " ✅ ZIP 包下载成功!"
118+ fi
119+ cp " $CACHE_ZIP " " $ZIP_FILE "
120+ date +%s > " $CACHE_TIMESTAMP "
79121 fi
80122
81- # 🔍 检查 unzip 是否存在
123+ # 检查 unzip
82124 if ! command -v unzip & > /dev/null; then
83- echo " ❗ 缺少 unzip 解压工具。 "
84- read -p " 是否尝试安装 unzip?(y/n): " INSTALL
125+ echo " ❗ 缺少 unzip"
126+ read -p " 是否安装 unzip?(y/n): " INSTALL
85127 if [[ " $INSTALL " =~ ^[yY]$ ]]; then
86128 if command -v apt & > /dev/null; then
87129 sudo apt update && sudo apt install -y unzip
@@ -90,46 +132,36 @@ if [[ "$SOURCE_CHOICE" == "1" ]]; then
90132 elif command -v pacman & > /dev/null; then
91133 sudo pacman -Sy unzip
92134 else
93- echo " ⚠️ 未识别的包管理器,请手动安装 unzip。" | tee -a " $LOG_FILE "
94- exit 1
135+ echo " ⚠️ 未知系统,请手动安装 unzip。" && exit 1
95136 fi
96137 else
97- echo " 🚫 未安装 unzip,脚本无法继续执行。" | tee -a " $LOG_FILE "
98- exit 1
138+ echo " 🚫 未安装 unzip,终止脚本。" && exit 1
99139 fi
100140 fi
101141
102142 unzip -q " $ZIP_FILE "
103143 ICON_SOURCE_DIR=$( find . -type d -path " */icons/$STYLE_FOLDER " | head -n1)
104- if [ ! -d " $ICON_SOURCE_DIR " ]; then
105- echo " ❌ 未找到 icons/$STYLE_FOLDER 目录。" | tee -a " $LOG_FILE "
106- exit 1
107- fi
144+ [[ ! -d " $ICON_SOURCE_DIR " ]] && echo " ❌ 找不到图标目录。" && exit 1
108145
109146elif [[ " $SOURCE_CHOICE " == " 2" ]]; then
110147 read -p " 请输入本地图标目录路径: " ICON_SOURCE_DIR
111- if [ ! -d " $ICON_SOURCE_DIR " ]; then
112- echo " ❌ 目录不存在:$ICON_SOURCE_DIR " | tee -a " $LOG_FILE "
113- exit 1
114- fi
115- else
116- echo " ❌ 输入无效,已退出。"
117- exit 1
148+ [[ ! -d " $ICON_SOURCE_DIR " ]] && echo " ❌ 目录不存在。" && exit 1
118149fi
119150
120- read -p " 是否继续替换图标?此操作不可撤销 (y/n): " CONFIRM
121- [[ " $CONFIRM " =~ ^[yY]$ ]] || { echo " 🚫 操作取消。" ; [[ " $SOURCE_CHOICE " == " 1" ]] && rm -rf " $TMP_DIR " ; exit 0; }
151+ # === 确认替换 ===
152+ read -p " 是否继续替换图标?(y/n): " CONFIRM
153+ [[ " $CONFIRM " =~ ^[yY]$ ]] || { echo " 🚫 已取消操作。" ; [[ " $SOURCE_CHOICE " == " 1" ]] && rm -rf " $TMP_DIR " ; exit 0; }
122154
123155{
124- echo " 🕒 替换开始 :$( date) "
156+ echo " 🕒 开始替换 :$( date) "
125157echo " 📁 图标源目录:$ICON_SOURCE_DIR "
126- echo " 🎯 替换目标目录 :$TARGET_DIR "
158+ echo " 🎯 目标目录 :$TARGET_DIR "
127159
128160find " $ICON_SOURCE_DIR " -type f \( -iname " *.png" -o -iname " *.svg" -o -iname " *.jpg" \) | while read -r file; do
129161 filename=$( basename " $file " )
130162 target=" $TARGET_DIR /$filename "
131163 if [ -f " $target " ]; then
132- cp " $file " " $target "
164+ cp " $file " " $target "
133165 echo " ✅ 替换:$filename "
134166 else
135167 echo " ⚠️ 跳过未匹配图标:$filename "
139171echo " ✅ 图标替换完成:$( date) "
140172} | tee -a " $LOG_FILE "
141173
174+ # 🧹 清理临时目录(仅 GitHub 下载模式下)
142175[[ " $SOURCE_CHOICE " == " 1" ]] && rm -rf " $TMP_DIR "
176+
177+ echo " "
178+ echo " 🎉 所有操作已完成!你现在可以刷新界面,查看新的图标样式效果啦~"
0 commit comments