编写Bash脚本筛选占用超阈值的最底层大子文件夹
仅输出符合磁盘占用阈值的最底层子文件夹的Bash脚本
以下是满足需求的脚本,它会精准定位符合磁盘占用阈值的最底层子目录,排除那些包含符合阈值子目录的父目录:
#!/bin/bash # 校验输入参数数量 if [ $# -ne 2 ]; then echo "用法: $0 <父目录> <磁盘占用阈值>" echo "示例: $0 /apps/ 200M" exit 1 fi PARENT_DIR="$1" THRESHOLD="$2" # 验证父目录是否存在 if [ ! -d "$PARENT_DIR" ]; then echo "错误: 父目录 $PARENT_DIR 不存在" exit 1 fi # 1. 收集所有符合阈值的目录,按路径长度倒序排序(深层目录优先处理) sorted_dirs=$(du -BM -d 0 "$PARENT_DIR"/* 2>/dev/null | awk -v threshold="$THRESHOLD" ' # 把人类可读的大小转换为字节,方便数值比较 function human_to_bytes(size) { suffix = substr(size, length(size)) num = substr(size, 1, length(size)-1) if (suffix == "M") return num * 1024 * 1024 if (suffix == "G") return num * 1024 * 1024 * 1024 if (suffix == "K") return num * 1024 return num # 默认按字节处理 } { dir_size = human_to_bytes($1) threshold_bytes = human_to_bytes(threshold) if (dir_size >= threshold_bytes) print $2 }' | awk '{print length($0), $0}' | sort -nr | cut -d' ' -f2-) # 2. 筛选最底层目录:排除所有已被保留子目录包含的父目录 declare -A kept_dirs for dir in $sorted_dirs; do is_bottom=true # 遍历当前目录的所有父目录,检查是否已被保留 temp_dir="$dir" while true; do temp_dir=$(dirname "$temp_dir") # 到达指定的父目录后停止检查 if [ "$temp_dir" = "$PARENT_DIR" ]; then break fi if [[ ${kept_dirs["$temp_dir"]} ]]; then is_bottom=false break fi done if $is_bottom; then kept_dirs["$dir"]=1 echo "$dir" fi done
脚本说明
- 参数校验:先确认输入参数数量正确,同时检查父目录是否存在,避免无效操作。
- 目录收集与过滤:
- 用
du -BM -d 0获取每个直接子目录的总大小(以MB为单位),-d 0确保不递归显示子目录的细分大小。 - 通过自定义函数将阈值和目录大小统一转换为字节,实现精准的数值比较,过滤出超过阈值的目录。
- 按目录路径长度倒序排序,确保深层子目录先被处理。
- 用
- 最底层目录筛选:
- 用关联数组记录已确认保留的目录。
- 遍历每个目录时,检查其所有父目录是否已被保留:若父目录在保留列表中,说明当前目录的父目录已符合阈值,无需重复输出;反之则保留当前目录。
使用方法
- 保存脚本为
find_bottom_dirs.sh,赋予执行权限:
chmod +x find_bottom_dirs.sh
- 运行脚本:
./find_bottom_dirs.sh /apps/ 200M
注意事项
- 阈值需使用
du兼容的单位格式,支持K(KB)、M(MB)、G(GB)等。 - 若需要包含隐藏目录,可移除
du命令中的--exclude=".*"选项(脚本中已注释该可选配置)。 - 运行脚本需要对目标目录有读取权限,否则
du会跳过无权限访问的目录。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

