EOF
# 收集磁盘使用数据并直接写入HTML
echo -e "${BLUE}正在扫描目录结构...${NC}"
# 格式化大小的函数
format_size() {
local bytes=$1
if [ $bytes -ge 1073741824 ]; then
echo "$(awk "BEGIN {printf \"%.2f\", $bytes/1073741824}")GB"
elif [ $bytes -ge 1048576 ]; then
echo "$(awk "BEGIN {printf \"%.2f\", $bytes/1048576}")MB"
elif [ $bytes -ge 1024 ]; then
echo "$(awk "BEGIN {printf \"%.2f\", $bytes/1024}")KB"
else
echo "${bytes}B"
fi
}
# 获取磁盘使用数据
TEMP_DATA=$(mktemp)
du -k --max-depth="$MAX_DEPTH" "$TARGET_DIR" 2>/dev/null | sort -nr | head -50 > "$TEMP_DATA"
# 检查是否有数据
if [ ! -s "$TEMP_DATA" ]; then
echo -e "${RED}警告: 无法获取磁盘使用数据${NC}"
echo -e "${YELLOW}可能的原因: 权限不足、目录不存在或du命令不可用${NC}"
# 写入无数据提示
cat >> "$OUTPUT_FILE" << 'EOF'
❌ 无法获取数据
可能的原因:
- 权限不足,请尝试使用 sudo
- 目录不存在或无法访问
- du 命令不可用
EOF
else
echo -e "${GREEN}找到 $(wc -l < "$TEMP_DATA") 个目录项${NC}"
# 读取最大大小用于计算百分比
MAX_SIZE_KB=$(head -1 "$TEMP_DATA" | awk '{print $1}')
MAX_SIZE_BYTES=$((MAX_SIZE_KB * 1024))
# 计算统计信息
TOTAL_ITEMS=$(wc -l < "$TEMP_DATA")
TOTAL_SIZE_FORMATTED=$(format_size $MAX_SIZE_BYTES)
AVG_SIZE_BYTES=$((MAX_SIZE_BYTES / TOTAL_ITEMS))
AVG_SIZE_FORMATTED=$(format_size $AVG_SIZE_BYTES)
# 处理每一行数据并写入HTML
while IFS=$'\t' read -r size_kb path; do
if [ -n "$size_kb" ] && [ -n "$path" ]; then
size_bytes=$((size_kb * 1024))
human_size=$(format_size $size_bytes)
percentage=$(awk "BEGIN {printf \"%.1f\", ($size_bytes/$MAX_SIZE_BYTES)*100}")
# 转义路径中的特殊字符
escaped_path=$(echo "$path" | sed 's/&/\&/g; s/\</g; s/>/\>/g; s/"/\"/g; s/'"'"'/\'/g')
# 计算目录层级(用于缩进)
level=$(echo "$path" | tr -cd '/' | wc -c)
indent=$((level * 20))
# 写入HTML树项
cat >> "$OUTPUT_FILE" << EOF
EOF
fi
done < "$TEMP_DATA"
fi
# 清理临时文件
rm -f "$TEMP_DATA"
# 写入HTML文件尾部
cat >> "$OUTPUT_FILE" << EOF