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

改造读取CSV的Shell脚本 支持近一月日期文件匹配及多路径传输

脚本改造实现方案

核心改造逻辑

  • 多任务支持:放弃原有cut一次性读取全列的写法,改为逐行解析CSV配置,每行对应一组独立传输任务,自动跳过空行、注释行和无效配置行
  • 近一月文件匹配:预生成近30天(可调整为自然月逻辑)的YYYYMMDD日期序列,拼接为filename_YYYYMMDD.txt格式的文件名做匹配,仅将实际存在的符合规则文件传入CD脚本
  • 统一路径配置:把CSV、CD脚本路径抽为全局变量,避免原有脚本硬编码路径不一致的问题

改造后完整脚本

#!/bin/bash
# 全局路径配置
FILE_LOCATION='/app/logs/CD_logs/checksum/dd.csv'
CD_SCRIPT='/app/logs/CD_logs/checksum/cd.sh'
# 匹配近N天的文件,默认30天,可按需调整
DATE_RANGE=30

# 预生成指定天数范围内的YYYYMMDD日期列表
date_list=()
for ((i=0; i<DATE_RANGE; i++)); do
    # Linux环境用下面这行
    date_list+=("$(date -d "-$i day" +%Y%m%d)")
    # macOS环境替换为下面这行
    # date_list+=("$(date -v-"$i"d +%Y%m%d)")
done

# 逐行读取CSV处理多组任务
while IFS=',' read -r file_prefix source_path dest_path || [ -n "$file_prefix" ]; do
    # 去除字段前后的空格、换行符
    file_prefix=$(echo "$file_prefix" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
    source_path=$(echo "$source_path" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
    dest_path=$(echo "$dest_path" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')

    # 跳过空字段的无效配置行
    if [ -z "$file_prefix" ] || [ -z "$source_path" ] || [ -z "$dest_path" ]; then
        continue
    fi
    # 跳过注释行
    if [[ "$file_prefix" =~ ^# ]]; then
        continue
    fi

    echo "处理任务:前缀=$file_prefix | 源路径=$source_path | 目标路径=$dest_path"

    # 收集当前任务下符合命名规则、日期范围且实际存在的文件
    matched_files=()
    for day in "${date_list[@]}"; do
        file_full_path="${source_path}/${file_prefix}${day}.txt"
        if [ -f "$file_full_path" ]; then
            matched_files+=("$file_full_path")
        fi
    done

    if [ ${#matched_files[@]} -eq 0 ]; then
        echo "  未找到近${DATE_RANGE}天符合规则的文件,跳过当前任务"
        continue
    fi
    echo "  匹配到文件:${matched_files[*]}"

    # 调用CD脚本,可根据cd.sh实际入参规则调整传参
    # 如果原有cd.sh接收三个参数:匹配规则、源路径、目标路径,保留下面调用即可
    # 如果cd.sh支持直接接收文件列表传输,可追加"${matched_files[@]}"作为参数
    . "$CD_SCRIPT" "$file_prefix" "$source_path" "$dest_path"
done < "$FILE_LOCATION"

echo "所有任务处理完成"

CSV配置格式说明

保持原有三列结构,每行对应一组独立传输任务:

  • 第一列:文件名前缀,例如要匹配order_20240520.txt则填order_
  • 第二列:对应文件的源存储绝对路径
  • 第三列:对应文件的目标存储绝对路径

配置示例:

# 交易类文件传输
trade_,/data/source/trade,/data/dest/trade
# 订单类文件传输
order_,/data/source/order,/data/dest/order
# 应用日志传输
app_runtime_,/var/log/app,/backup/log/app

支持空行分隔任务,支持#开头写注释。


调整说明

  • 如果需要按自然月规则匹配(例如当月1号匹配上一个整月的文件),只需修改日期列表生成部分的逻辑即可
  • 脚本编写完成后执行chmod +x 你的脚本文件名.sh添加执行权限
  • 原有脚本中CD脚本路径存在/app/logs和/app/sas/saslogs两个不一致的配置,改造时统一使用顶部CD_SCRIPT变量配置的路径即可,避免执行时报找不到文件的错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 08:51:28