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
相关产品推荐
相关产品推荐

