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

使用数组实现循环迭代生成Zip文件:脚本无报错但未生成文件

问题分析与解决

你的脚本未生成Zip文件,核心问题出在目录名的斜杠处理和Zip命令的递归参数上,以下是具体问题拆解和修复方案:

问题点梳理

  1. 无效的Zip文件名:dirs=(*/) 获取的目录名末尾带有斜杠(例如app-inbound/),拼接成"$sub_dir".zip后会变成app-inbound/.zip,属于不符合规范的文件名,系统无法正常创建。
  2. 缺少递归压缩参数:直接执行zip 文件名 目录只会将目录本身(作为空条目)加入压缩包,不会递归压缩目录内的文件,若目录无内容则可能不生成有效Zip文件。
  3. 工作目录未恢复:脚本cd "$d"后未返回初始目录,虽当前场景仅一层循环,但会导致后续操作的工作目录混乱,属于不良编码习惯。

修正后的脚本

#!/bin/bash
start_dir=/tmp/Inbound
echo "start_dir=$start_dir"

# 保存初始工作目录,后续恢复
original_dir=$(pwd)

for d in "$start_dir"/*/ ; do
    # 进入目标目录,失败则跳过当前循环(避免脚本直接终止)
    cd "$d" || continue
    dirs=(*/)
    declare -p dirs
    echo "Entering into location: $(pwd)"
    for sub_dir in "${dirs[@]}"
    do
        # 移除目录名末尾的斜杠
        clean_sub_dir=${sub_dir%/}
        echo "Compressing $clean_sub_dir..."
        # 用-r参数递归压缩目录内容,指定合法的Zip文件名
        zip -r "$clean_sub_dir.zip" "$clean_sub_dir"
    done
    # 回到初始工作目录
    cd "$original_dir" || exit
done

关键修改说明

  • 去除目录末尾斜杠:通过${sub_dir%/}截取目录名最后的斜杠,生成合法的Zip文件名(如app-inbound.zip)。
  • 添加递归参数-r:让Zip命令递归压缩目录内所有文件和子目录,生成包含内容的有效压缩包。
  • 保存并恢复初始目录:避免脚本执行过程中工作目录漂移,提升脚本健壮性。
  • 用continue替代exit:若某一次cd失败,脚本不会直接终止,而是跳过当前循环继续执行后续逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:17:16