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

Shell脚本月度SFTP文件迁移:日期循环与文件名拼接需求咨询

解决方案

1. 动态计算起止日期并实现日期循环

首先要根据输入的MMYYYY参数(示例为022024)自动算出起止日期:

  • 结束日期:当月11日,格式为DDMMYYYY(示例:11022024)
  • 开始日期:上月12日,格式为DDMMYYYY(示例:12012024)

用date命令处理日期转换和计算,能避免直接数字比较的误差,以下是循环的核心逻辑:

2. 拼接完整文件名

直接把生成的DDMMYYYY格式日期字符串和输入的文件名后缀拼接,格式为${date_str}${filename_suffix}即可。

完整脚本实现

#!/bin/bash

# 校验输入参数数量
if [ $# -ne 2 ]; then
    echo "用法: $0 <文件名后缀> <年月(MMYYYY)>"
    echo "示例: $0 _DAILY_REJECT.csv 022024"
    exit 1
fi

filename_suffix=$1
month_param=$2

# 拆分年月参数
input_month=${month_param:0:2}
input_year=${month_param:2:4}

# 计算结束日期:当月11日,转DDMMYYYY格式
end_date_str=$(date -d "${input_year}-${input_month}-11" +%d%m%Y)
# 计算开始日期:上月12日,转DDMMYYYY格式
start_date_str=$(date -d "${input_year}-${input_month}-11 -1 month +1 day" +%d%m%Y)

# 转换日期字符串为时间戳,用于循环比较
start_ts=$(date -d "$(echo $start_date_str | sed -r 's/(..)(..)(....)/\3-\2-\1/')" +%s)
end_ts=$(date -d "$(echo $end_date_str | sed -r 's/(..)(..)(....)/\3-\2-\1/')" +%s)

current_ts=$start_ts

# SFTP配置(请根据实际环境修改)
remote_sftp_host="客户SFTP服务器地址"
remote_sftp_user="用户名"
remote_sftp_pass="密码" # 注意:明文密码不安全,优先用SSH密钥认证
remote_file_dir="/客户SFTP文件目录"
local_temp_dir="/本地临时存储目录"
target_dir="/最终归档目录"

while [ $current_ts -le $end_ts ]; do
    # 转换当前时间戳为DDMMYYYY格式
    current_date_str=$(date -d "@$current_ts" +%d%m%Y)
    # 拼接完整文件名
    full_filename="${current_date_str}${filename_suffix}"

    echo "正在处理: $full_filename"

    # 1. 检查远程文件是否存在
    sftp -o BatchMode=no -b - $remote_sftp_user@$remote_sftp_host << EOF
    cd $remote_file_dir
    ls $full_filename
EOF
    if [ $? -eq 0 ]; then
        echo "文件存在,开始下载..."
        # 2. 下载文件到本地临时目录
        sftp -o BatchMode=no -b - $remote_sftp_user@$remote_sftp_host << EOF
        cd $remote_file_dir
        get $full_filename $local_temp_dir/
EOF
        if [ $? -eq 0 ]; then
            echo "下载成功,移动到目标目录..."
            # 3. 移动文件到指定目录
            mv "$local_temp_dir/$full_filename" "$target_dir/"
            [ $? -eq 0 ] && echo "移动完成" || echo "错误:移动文件失败"
        else
            echo "错误:下载文件失败"
        fi
    else
        echo "文件不存在,跳过"
    fi

    # 日期递增一天(86400秒)
    current_ts=$((current_ts + 86400))
done

echo "所有文件处理完毕"

关键说明

  • 日期处理:用date命令的日期计算功能动态生成起止日期,时间戳比较确保循环逻辑准确,跨月跨年都适用。
  • SFTP操作:采用here-doc编写批处理命令,实现文件检查、下载;建议用SSH密钥认证替代明文密码,提升安全性。
  • 错误校验:每一步操作都检查返回值,出现问题能明确提示。
  • 参数校验:脚本开头检查输入参数数量,避免因参数缺失导致错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 06:23:23