Linux多文件夹文件统计Shell脚本运行过慢优化求助
脚本问题根因与优化方案
原脚本核心问题
- 存在完全冗余的嵌套执行逻辑:先全量遍历文件夹拿到所有文件列表,又遍历每个文件时重复执行全量
find统计,若单文件夹下有10万个文件,就会重复执行10万次find命令,这是耗时极长的核心原因 - 重复调用
date命令:日期值不需要在循环内反复计算,甚至不需要计算两次,提前计算一次即可 - 过滤逻辑低效:先全量
find返回所有文件,再用grep匹配日期,远不如直接在find中加过滤条件效率高 - 未做路径兼容性处理:未加引号包裹路径变量,遇到带空格的路径会执行出错
优化后脚本
#!/bin/bash # 提前全局计算统计日期,仅执行1次 dat=$(date -d '-1 day' '+%g%m%d') input_path="/bgw_vol01/script/input_path_CDR.txt" output_file="output_${dat}.txt" # 提前清空输出文件,避免历史追加残留 > "$output_file" # 按行读取路径,兼容带空格的路径 while IFS= read -r folder; do # 单次find直接过滤匹配日期的文件,统计数量 count=$(find "$folder" -type f -name "*${dat}*" | wc -l) echo "${HOSTNAME}|${folder}|${dat}|File count: ${count}" >> "$output_file" done < "$input_path"
优化效果说明
- 每个文件夹仅执行1次
find命令,无冗余重复执行,整体耗时和手动单文件夹执行命令的总耗时一致,10个文件夹统计总耗时不会超过2分钟 - 所有变量仅计算1次,无多余进程开销
- 路径处理更规范,避免特殊路径执行报错
内容的提问来源于stack exchange,提问作者ninhdt4
相关产品推荐
相关产品推荐

