求简化Unix脚本:输出3个最大目录及其3个最大子目录
简化版脚本及原脚本解析
简化版脚本
支持直接传入目标路径,无需修改脚本内部,执行时可指定路径(如./top_dirs.sh /log),默认处理/var:
#!/bin/bash # 目标路径,默认/var,可通过第一个参数指定 TARGET_DIR="${1:-/var}" echo "=== ${TARGET_DIR} 下前3大的目录 ===" # 获取目标路径下前3大的目录,逐行处理 du -sh "${TARGET_DIR}"/* 2>/dev/null | sort -hr | head -3 | while read -r size dir; do echo "${size} ${dir}" # 输出当前目录下前3大的子目录,添加缩进区分层级 echo -e "\t=== ${dir} 下前3大的子目录 ===" du -sh "${dir}"/* 2>/dev/null | sort -hr | head -3 | sed 's/^/\t/' echo "" done
原脚本问题解析
- 临时文件冗余且易冲突:用脚本名生成临时文件名,多实例运行会互相覆盖,且脚本结束后未清理临时文件,会残留垃圾文件。
- 路径处理不严谨:通过
for dir in $(cat ...)读取路径,若目录名含空格会被拆分,导致后续du命令执行错误。 - 改路径出错的常见原因:
- 硬编码
/var,改路径时需多处修改,容易漏改导致逻辑混乱; - 若
/log无访问权限或不存在,du的错误被丢弃,但后续空内容处理会引发异常。
- 硬编码
- 冗余函数:
top3函数用awk提取路径,实际上du输出的第二列就是完整路径,直接读取更高效。
使用说明
- 给脚本添加执行权限:
chmod +x top_dirs.sh - 查看默认路径(/var)的目录:
./top_dirs.sh - 查看指定路径(如/log)的目录:
./top_dirs.sh /log
内容的提问来源于stack exchange,提问作者ascii1118
相关产品推荐
相关产品推荐

