如何在循环中遍历指定目录下的.gz文件并提取打印数据?
问题分析与修正方案
原代码的核心问题是未正确指定.gz文件的路径,外层循环的k变量完全未被使用,导致每次都在当前目录查找文件,而非目标d091/d092等目录。另外用ls *.gz遍历文件存在风险(如文件名含空格时会出错),直接用通配符遍历更安全。
修正后的代码
shopt -s nullglob # 取消failglob,避免目录下无.gz文件时直接报错退出 # shopt -s failglob # 遍历d091到d150所有目标目录 for k in {091..150}; do dir="d${k}" # 遍历当前目标目录下的所有.gz文件 for file in "${dir}"/*.gz; do # 跳过空值(目录下无.gz文件时,nullglob会让file为空) [[ -f "$file" ]] || continue # 提取纯文件名(去掉路径),避免路径字符干扰子串截取 filename=$(basename "$file") # 提取文件名前4个字符追加到receiver_ids echo "${filename:0:4}" | tee -a receiver_ids # 从文件名第16位开始提取17个字符追加到doy(注意:${var:起始位置:长度}) echo "${filename:16:17}" | tee -a doy # 提取文件名前100个字符追加到data_record echo "${filename:0:100}" | tee -a data_record done done
关键修改说明
- 路径定位:通过
"${dir}"/*.gz动态指定目标目录下的.gz文件,结合外层循环的k变量匹配d091到d150目录。 - 安全遍历:直接用通配符遍历文件,替代
ls输出,避免文件名含特殊字符时出现错误。 - 空目录处理:保留
nullglob让无文件时通配符返回空,再通过[[ -f "$file" ]]判断跳过空值,防止无文件时执行无效操作。 - 文件名提取:用
basename获取纯文件名,确保子串截取的是文件名本身,不会被路径前缀(如d091/)干扰。
内容的提问来源于stack exchange,提问作者zeldazonk32
相关产品推荐
相关产品推荐

