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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 23:57:43