Shell脚本文件名识别异常求助:通配符匹配失败问题
问题排查与解决
1. 时间截取错误导致文件名匹配失败
你的CURRENT_TIME用+%Y%m%d%H%M生成的是12位时间字符串(例如202409020150),但${CURRENT_TIME:0:11}截取了前11位,得到11位的20240902011,而目标文件名的时间部分是14位的20240902005000(格式为YYYYMMDDHHMMSS),两者长度、格式完全不匹配,根本找不到对应文件。
如果目标文件名的时间格式是YYYYMMDDHHMMSS,需修改date命令格式并调整截取逻辑:
# 生成包含秒的14位时间字符串 CURRENT_TIME=$(date -d " +1 hour +50 minutes" +%Y%m%d%H%M%S) # 截取前12位(匹配文件名的YYYYMMDDHHMM前缀) FILE_NAME_PART=${CURRENT_TIME:0:12}
2. lftp的mput通配符解析异常
错误提示*.csv: no files found_test/CTI_poult_20240902011显示路径拼接混乱,原因是lftp默认对本地路径通配符的解析逻辑存在问题。推荐两种解决方式:
方式一:让本地Shell先展开文件名
先通过Shell匹配到目标文件,再传给lftp上传,避免lftp解析通配符出错:
CURRENT_TIME=$(date -d " +1 hour +50 minutes" +%Y%m%d%H%M%S) FILE_NAME_PART=${CURRENT_TIME:0:12} TARGET_FILES="/home/cti/10min_test/CTI_poult_${FILE_NAME_PART}*.csv" echo "FILE_NAME_PART: ${FILE_NAME_PART}" echo "SOAP PROJECT: Starting SFTP…" # 先检查是否存在匹配文件 if ls $TARGET_FILES 1>/dev/null 2>&1; then lftp -d -u myuser,mypass sftp://myip:port <<EOF mput $TARGET_FILES bye EOF else echo "No matching files found: $TARGET_FILES" fi echo "done"
方式二:开启lftp的本地通配符扩展
在lftp会话中启用ftp:glob配置,确保mput能正确解析本地路径的通配符:
CURRENT_TIME=$(date -d " +1 hour +50 minutes" +%Y%m%d%H%M%S) FILE_NAME_PART=${CURRENT_TIME:0:12} echo "FILE_NAME_PART: ${FILE_NAME_PART}" echo "SOAP PROJECT: Starting SFTP…" lftp -d -u myuser,mypass sftp://myip:port <<EOF set ftp:glob yes mput /home/cti/10min_test/CTI_poult_${FILE_NAME_PART}*.csv bye EOF echo "done"
3. 验证步骤
- 手动执行
ls /home/cti/10min_test/CTI_poult_${FILE_NAME_PART}*.csv,确认是否能列出目标文件,排除文件名匹配问题。 - 单独执行
date -d " +1 hour +50 minutes" +%Y%m%d%H%M%S,检查时间偏移是否正确,确保生成的FILE_NAME_PART和目标文件名前缀一致。
内容的提问来源于stack exchange,提问作者Chihyun Ahn
相关产品推荐
相关产品推荐

