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

bash中如何将相同前缀的csv文件打包为对应zip压缩包

问题排查与正确实现

原代码错误说明

  • 数组遍历错误:直接使用$unique_sorted_list只会读取数组的第一个元素,遍历完整数组需要写成"${unique_sorted_list[@]}"
  • 条件判断语法错误:bash的字符串比较需要放在[]内,且操作符两侧必须留空格;同时$j是带路径的文件名,直接用cut切割会把路径纳入计算,得到错误的前缀;另外if判断也缺少结束的fi关键字
  • zip命令参数错误:你没有指定压缩包名称,-jr参数后第一个参数应该是压缩包名,后续才是要打包的文件列表

正确实现方案

方案1:高效版(推荐,无需嵌套循环)

直接用通配符匹配对应前缀的所有文件,不需要内层遍历整个目录,代码如下:

# 定义csv文件存储目录
search_dir="/home/user/test"

# 你原有提取唯一前缀的逻辑可直接复用
liste_sirets=()
for entry in "$search_dir"/*
do
  f1=${entry##*/}
  f2=${f1%%_*}
  liste_sirets+=("$f2")
done
unique_sorted_list=($(printf "%s\n" "${liste_sirets[@]}" | sort -u ))

# 打包逻辑
for prefix in "${unique_sorted_list[@]}"
do
  # 按规则定义压缩包名
  zip_name="${prefix}_24112021_M2.zip"
  # 匹配所有该前缀的csv文件打包,-j参数表示忽略路径只存文件名
  zip -j "$search_dir/$zip_name" "$search_dir/${prefix}_"*.csv
done

方案2:嵌套循环修正版(如需保留嵌套逻辑可使用)

for prefix in "${unique_sorted_list[@]}"
do
  zip_name="${prefix}_24112021_M2.zip"
  # 先删除旧压缩包避免重复追加内容
  rm -f "$search_dir/$zip_name"
  for file in "$search_dir"/*
  do
    filename=${file##*/}
    file_prefix=${filename%%_*}
    if [ "$file_prefix" = "$prefix" ]
    then
      zip -j "$search_dir/$zip_name" "$file"
    fi
  done
done

验证方式

打包完成后可以执行unzip -l 压缩包路径查看压缩包内的文件列表,确认对应前缀的所有csv文件都已被正确打包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:24:02