Spaces:
Paused
Paused
| # 磁盘空间占用检测脚本 | |
| # 用于检测指定目录下所有文件和文件夹的大小,并按大小倒序排列 | |
| # 颜色定义 | |
| RED='\033[0;31m' | |
| GREEN='\033[0;32m' | |
| YELLOW='\033[1;33m' | |
| BLUE='\033[0;34m' | |
| NC='\033[0m' # No Color | |
| # 默认参数 | |
| DIRECTORY="${1:-$HOME}" | |
| TOP_N="${2:-100}" | |
| SHOW_HIDDEN=true | |
| # 帮助信息 | |
| show_help() { | |
| echo "用法: $0 [目录路径] [显示数量]" | |
| echo "" | |
| echo "参数:" | |
| echo " 目录路径 要扫描的目录 (默认: 当前用户主目录)" | |
| echo " 显示数量 显示前N个最大的文件 (默认: 100)" | |
| echo "" | |
| echo "选项:" | |
| echo " -h, --help 显示此帮助信息" | |
| echo "" | |
| echo "示例:" | |
| echo " $0 # 扫描主目录,显示前100个最大文件" | |
| echo " $0 ~ 50 # 扫描主目录,显示前50个最大文件" | |
| echo " $0 /Users/pro 200 # 扫描指定目录,显示前200个最大文件" | |
| echo " $0 ~/Library 100 # 扫描Library目录" | |
| echo "" | |
| echo "常见大文件目录:" | |
| echo " ~/Library # 应用程序缓存和数据" | |
| echo " ~/Downloads # 下载文件" | |
| echo " ~/Documents # 文档" | |
| echo " ~/Desktop # 桌面" | |
| echo " ~/Movies # 视频文件" | |
| echo " ~/Pictures # 图片文件" | |
| echo "" | |
| echo "提示: 此脚本会扫描所有文件(包括隐藏文件),可能需要较长时间" | |
| } | |
| # 解析参数 | |
| while [[ $# -gt 0 ]]; do | |
| case $1 in | |
| -h|--help) | |
| show_help | |
| exit 0 | |
| ;; | |
| *) | |
| if [ -z "$DIR_SET" ]; then | |
| DIRECTORY="$1" | |
| DIR_SET=true | |
| elif [ -z "$NUM_SET" ]; then | |
| TOP_N="$1" | |
| NUM_SET=true | |
| fi | |
| shift | |
| ;; | |
| esac | |
| done | |
| # 展开路径 | |
| DIRECTORY="${DIRECTORY/#\~/$HOME}" | |
| # 检查目录是否存在 | |
| if [ ! -d "$DIRECTORY" ]; then | |
| echo -e "${RED}错误: 目录不存在: $DIRECTORY${NC}" | |
| exit 1 | |
| fi | |
| echo -e "${GREEN}========================================================${NC}" | |
| echo -e "${YELLOW}正在扫描目录: $DIRECTORY${NC}" | |
| echo -e "${YELLOW}显示前 $TOP_N 个最大的文件(包括所有隐藏文件)${NC}" | |
| echo -e "${GREEN}========================================================${NC}" | |
| echo "" | |
| echo -e "${BLUE}请稍候,正在扫描所有文件并计算大小...${NC}" | |
| echo -e "${BLUE}这可能需要几分钟时间,请耐心等待...${NC}" | |
| echo "" | |
| # 临时文件 | |
| TEMP_FILE=$(mktemp) | |
| # 扫描目录下的所有文件(包括隐藏文件) | |
| # 使用 find 命令查找所有文件,然后计算每个文件的大小 | |
| find "$DIRECTORY" -type f -exec du -k {} + 2>/dev/null | sort -rn > "$TEMP_FILE" | |
| # 打印表头 | |
| echo -e "${GREEN}========================================================${NC}" | |
| printf "${YELLOW}%-15s %-s${NC}\n" "大小" "文件路径" | |
| echo -e "${GREEN}========================================================${NC}" | |
| # 计数器 | |
| count=0 | |
| total_size=0 | |
| # 读取并显示结果 | |
| while IFS=$'\t' read -r size path; do | |
| count=$((count + 1)) | |
| total_size=$((total_size + size)) | |
| # 转换大小为人类可读格式 | |
| if [ $size -lt 1024 ]; then | |
| readable_size="${size} KB" | |
| elif [ $size -lt 1048576 ]; then | |
| readable_size=$(awk "BEGIN {printf \"%.2f MB\", $size/1024}") | |
| elif [ $size -lt 1073741824 ]; then | |
| readable_size=$(awk "BEGIN {printf \"%.2f GB\", $size/1048576}") | |
| else | |
| readable_size=$(awk "BEGIN {printf \"%.2f TB\", $size/1073741824}") | |
| fi | |
| # 打印结果 | |
| printf "%-15s %s\n" "$readable_size" "$path" | |
| # 达到指定数量后退出 | |
| if [ $count -ge $TOP_N ]; then | |
| break | |
| fi | |
| done < "$TEMP_FILE" | |
| # 打印总计 | |
| echo -e "${GREEN}========================================================${NC}" | |
| # 转换总大小 | |
| if [ $total_size -lt 1024 ]; then | |
| total_readable="${total_size} KB" | |
| elif [ $total_size -lt 1048576 ]; then | |
| total_readable=$(awk "BEGIN {printf \"%.2f MB\", $total_size/1024}") | |
| elif [ $total_size -lt 1073741824 ]; then | |
| total_readable=$(awk "BEGIN {printf \"%.2f GB\", $total_size/1048576}") | |
| else | |
| total_readable=$(awk "BEGIN {printf \"%.2f TB\", $total_size/1073741824}") | |
| fi | |
| echo -e "${YELLOW}总计 (前$count个文件): $total_readable${NC}" | |
| echo -e "${GREEN}========================================================${NC}" | |
| # 清理临时文件 | |
| rm -f "$TEMP_FILE" | |
| echo "" | |
| echo -e "${BLUE}提示: 使用 '$0 --help' 查看更多选项${NC}" | |