adaptive_rag / check_disk_usage.sh
lanny xu
check disk usage
95a1f44
#!/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}"