#!/usr/bin/env bash # ============================================================================ # MAX DiskReport — 磁盘深度使用报告 # 原创脚本,整合 df / du / iostat / find 功能于一体 # # 风险等级: 🟢 只读 — 不修改任何系统设置 # 用法: bash <(curl -fsSL https://dl.unvmax.com/linux/scripts/max-tools/max-diskreport.sh) # bash <(curl -fsSL https://dl.unvmax.com/linux/scripts/max-tools/max-diskreport.sh) /var/log # ============================================================================ set -e R='\033[1;31m' G='\033[1;32m' Y='\033[1;33m' B='\033[1;34m' C='\033[1;36m' M='\033[1;35m' W='\033[1;37m' N='\033[0m' GR='\033[90m' echo -e "${B}┌─────────────────────────────────────────────┐${N}" echo -e "${B}│${N} ${G}MAX 磁盘深度报告${N} ${GR}(只读诊断)${N}" echo -e "${B}└─────────────────────────────────────────────┘${N}" echo TARGET="${1:-/}" echo -e " ${M}1. 分区使用率一览${N}" echo -e " ${GR}───${N}" df -hT 2>/dev/null | grep '^/' | sort -rn -k6 | while read -r line; do pct=$(echo "$line" | awk '{print $6}' | tr -d '%') fs=$(echo "$line" | awk '{print $1}') fstype=$(echo "$line" | awk '{print $2}') size=$(echo "$line" | awk '{print $3}') used=$(echo "$line" | awk '{print $4}') mount=$(echo "$line" | awk '{print $7}') [ "$pct" -gt 85 ] && c=$R [ "$pct" -gt 70 ] && [ "$pct" -le 85 ] && c=$Y [ "$pct" -le 70 ] && c=$G echo -e " ${c}${used}/${size} ($pct%)${N} ${GR}$fstype $fs → $mount${N}" done echo -e "\n ${M}2. Inode 使用率${N}" echo -e " ${GR}───${N}" df -i 2>/dev/null | grep '^/' | head -5 | while read -r line; do ipct=$(echo "$line" | awk '{print $5}' | tr -d '%') mount=$(echo "$line" | awk '{print $6}') [ "$ipct" -gt 80 ] && c=$R [ "$ipct" -gt 60 ] && [ "$ipct" -le 80 ] && c=$Y [ "$ipct" -le 60 ] && c=$G echo -e " ${c}Inode: $ipct%${N} ${GR}$mount${N}" done echo -e "\n ${M}3. 大目录 TOP10 (${TARGET})${N}" echo -e " ${GR}───${N}" if command -v du &>/dev/null; then du -hx --max-depth=3 "$TARGET" 2>/dev/null | sort -rh | head -10 | while read -r line; do echo -e " ${GR}$line${N}" done else echo -e " ${Y}du 命令不可用${N}" fi echo -e "\n ${M}4. 磁盘 IO 状态${N}" echo -e " ${GR}───${N}" if command -v iostat &>/dev/null; then iostat -x 1 2 2>/dev/null | tail -20 | head -15 else echo -e " ${Y}(iostat 未安装,使用 /proc/diskstats 摘要)${N}" awk '/[a-z]d[a-z]/ { dev = $3; r_sec = $6; w_sec = $10 r_time = $7; w_time = $11 printf " %-8s 读扇区:%-12s 写扇区:%-12s IO时间:%-6s\n", dev, r_sec, w_sec, r_time + w_time }' /proc/diskstats 2>/dev/null | head -10 fi echo -e "\n ${M}5. 超大文件 TOP10 (≥100MB)${N}" echo -e " ${GR}───${N}" found=$(find "$TARGET" -xdev -type f -size +100M 2>/dev/null | head -1) if [ -n "$found" ]; then find "$TARGET" -xdev -type f -size +100M 2>/dev/null -exec ls -lh {} \; 2>/dev/null | \ awk '{print $5, $NF}' | sort -rh | head -10 | while read -r line; do echo -e " ${Y}$line${N}" done else echo -e " ${GR}($TARGET 下无超过 100MB 的文件)${N}" fi echo echo -e "${GR}👉 配合使用: max-sysinfo.sh (系统概览) | max-bench.sh (性能测试)${N}"