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
相关产品推荐
相关产品推荐

