如何获取指定用户的所有文件夹并按大小排序,同时统计总大小?
特定用户文件夹按大小排序并统计总大小的解决方案
你的原脚本存在两个主要问题:一是会遍历所有匹配的文件和文件夹(而你只需要文件夹),二是单独对每个文件夹执行du会重复计算嵌套文件夹的大小,同时无法直接得到总大小。下面是优化后的两种方案:
方案1:统计文件夹包含内容的总大小(含子文件夹)
该方案会列出所有符合条件的文件夹,并显示每个文件夹包含所有内容的大小,最后统计总和:
#!/bin/bash read -p "Enter user: " username # 找到目标用户的所有文件夹,按人类可读大小倒序排序 find /path/ -maxdepth 4 -user "$username" -type d -print0 | du -sh --files0-from=- | sort -hr # 计算并显示总大小(转换为GB单位,可按需调整) echo -e "\nTotal size:" find /path/ -maxdepth 4 -user "$username" -type d -print0 | du -sb --files0-from=- | awk '{sum+=$1} END {printf "%.2f GB\n", sum/1024/1024/1024}'
关键参数说明:
-type d:仅筛选文件夹,排除文件-print0+--files0-from=-:处理包含空格、特殊字符的文件夹名称,避免脚本报错du -sh:输出人类可读的文件夹总大小(含子文件夹)sort -hr:按大小倒序排序(h识别人类可读单位,r倒序)du -sb:输出字节数,方便awk精确求和,最后转换为GB并保留两位小数
方案2:仅统计文件夹本身的大小(不含子文件夹)
如果你不想重复统计父文件夹和子文件夹的大小,可以使用-d 0参数让du仅计算文件夹自身的大小:
#!/bin/bash read -p "Enter user: " username # 仅统计文件夹自身大小,按大小倒序排序 find /path/ -maxdepth 4 -user "$username" -type d -print0 | du -d 0 -h --files0-from=- | sort -hr # 计算并显示总大小 echo -e "\nTotal size:" find /path/ -maxdepth 4 -user "$username" -type d -print0 | du -d 0 -b --files0-from=- | awk '{sum+=$1} END {printf "%.2f GB\n", sum/1024/1024/1024}'
关键参数说明:
du -d 0:仅统计当前文件夹的大小,不递归计算子文件夹内容
内容的提问来源于stack exchange,提问作者Wolfgang
相关产品推荐
相关产品推荐

