File size: 4,618 Bytes
95a1f44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/bin/bash

# 磁盘空间占用检测脚本
# 用于检测指定目录下所有文件和文件夹的大小,并按大小倒序排列

# 颜色定义
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}"