You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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

脚本说明

  1. 参数校验:先确认输入参数数量正确,同时检查父目录是否存在,避免无效操作。
  2. 目录收集与过滤:
    • 用du -BM -d 0获取每个直接子目录的总大小(以MB为单位),-d 0确保不递归显示子目录的细分大小。
    • 通过自定义函数将阈值和目录大小统一转换为字节,实现精准的数值比较,过滤出超过阈值的目录。
    • 按目录路径长度倒序排序,确保深层子目录先被处理。
  3. 最底层目录筛选:
    • 用关联数组记录已确认保留的目录。
    • 遍历每个目录时,检查其所有父目录是否已被保留:若父目录在保留列表中,说明当前目录的父目录已符合阈值,无需重复输出;反之则保留当前目录。

使用方法

  1. 保存脚本为find_bottom_dirs.sh,赋予执行权限:
chmod +x find_bottom_dirs.sh
  1. 运行脚本:
./find_bottom_dirs.sh /apps/ 200M

注意事项

  • 阈值需使用du兼容的单位格式,支持K(KB)、M(MB)、G(GB)等。
  • 若需要包含隐藏目录,可移除du命令中的--exclude=".*"选项(脚本中已注释该可选配置)。
  • 运行脚本需要对目标目录有读取权限,否则du会跳过无权限访问的目录。

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 10:43:24