改造读取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
相关产品推荐
相关产品推荐

