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

如何在循环中遍历指定目录下的.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:40:33