如何在集群中按用户统计文件数量及占用空间?
集群环境下按用户统计文件数量与占用空间的方法
Bash 实现方式
一键统计命令
通过find遍历目标目录,结合awk聚合统计每个用户的文件数量和总占用空间:
find /user/hive/warehouse/yp.db -type f -printf "%u %s\n" | awk '{ count[$1]++; # 累加用户的文件数量 size[$1] += $2; # 累加用户的文件总大小(字节) } END { # 循环输出统计结果,将字节转换为GB for (user in count) { printf "用户%s: 文件数量=%d, 总占用空间=%.2fGB\n", user, count[user], size[user]/1024/1024/1024; } }'
- 说明:
find的%u参数获取文件属主用户名,%s获取文件字节大小;awk通过数组实现分组统计,最后统一格式化输出。
Python 实现方式
正确统计脚本
以下脚本通过遍历目录文件、获取文件属主信息,实现精准统计:
import os import pwd from collections import defaultdict target_dir = "/user/hive/warehouse/yp.db" # 初始化统计字典:键为用户名,值为[文件数量, 总大小(字节)] user_stats = defaultdict(lambda: [0, 0]) # 遍历目标目录下所有文件 for root, _, files in os.walk(target_dir): for file_name in files: file_path = os.path.join(root, file_name) try: # 获取文件的属主UID,转换为用户名 file_stat = os.stat(file_path) username = pwd.getpwuid(file_stat.st_uid).pw_name # 更新统计数据 user_stats[username][0] += 1 user_stats[username][1] += file_stat.st_size except Exception as e: print(f"处理文件 {file_path} 失败: {str(e)}") # 格式化输出结果 for user, (file_count, total_size) in user_stats.items(): total_size_gb = total_size / (1024 ** 3) print(f"用户{user}: 文件数量={file_count}, 总占用空间={total_size_gb:.2f}GB")
原代码问题修正
你提供的原代码存在两处核心错误:
cut -d: -f1 /user/hive/warehouse/yp.db逻辑错误:该路径是Hive仓库目录,并非用户密码文件(如/etc/passwd),无法提取用户名;- 调用
du -s的逻辑错误:仅统计目录大小,无法区分不同用户创建的文件,不符合按用户统计的需求。
内容的提问来源于stack exchange,提问作者howtoplay112
相关产品推荐
相关产品推荐

