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

Bash脚本报错排查:检查文件名是否含末尾时间戳并移动文件

解决bash脚本中[: missing ]错误的问题

嘿,这个错误其实是bash里常见的语法小坑,咱们一步步拆解解决:

直接触发错误的原因

你的if条件里,[是test命令的别名,它对空格的要求特别严格——在]的前面必须加一个空格!

看你原来的代码:

if [ -f ${PRODUCT_HOME}/file.*.zip]; then

这里的];是连在一起的,bash会把file.*.zip];当成一个整体参数,找不到对应的闭合],所以直接抛出[: missing ]的错误。

只要调整成下面这样,就能修复这个语法问题:

if [ -f ${PRODUCT_HOME}/file.*.zip ]; then

注意file.*.zip和]之间的空格!

隐藏的另一个核心问题

不过还有个容易忽略的隐患:-f选项是用来检查单个文件是否存在且为普通文件的,但file.*.zip是通配符,如果匹配到多个文件(比如同时有file.20240520.zip和file.20240521.zip),[ -f ]会因为参数过多直接报错,这也是你后续可能遇到的问题。

修正后的完整脚本

我帮你调整了逻辑,既能处理单个/多个带时间戳的文件,也能避免各种报错:

while read product; do
    # 用数组存储所有匹配带时间戳的文件
    timestamp_files=("${PRODUCT_HOME}/file.*.zip")
    
    # 检查是否真的存在匹配的文件(避免通配符本身不匹配时的情况)
    if [ -f "${timestamp_files[0]}" ]; then
        echo "Found files with timestamp."
        # 循环处理每个匹配的文件,保留原文件名避免覆盖
        for file in "${PRODUCT_HOME}/file.*.zip"; do
            mv "$file" "/home/has_time_stamp/$(basename "$file")"
        done
    else
        echo "No timestamped files found."
        # 先检查目标文件是否存在,再执行移动
        if [ -f "${PRODUCT_HOME}/file.zip" ]; then
            mv "${PRODUCT_HOME}/file.zip" "/home/no_time_stamp/file.zip"
        else
            echo "Error: file.zip not found in ${PRODUCT_HOME}!"
        fi
    fi
done <product_details.txt

几个关键优化点:

  • 用数组存储通配符结果,准确判断是否有匹配的文件
  • 循环处理多个带时间戳的文件,移动时保留原文件名(避免多个文件覆盖成同一个file.zip)
  • 添加了file.zip的存在性检查,防止mv命令因为找不到文件而报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:39:13