如何修改Shell脚本实现按文件数拆分压缩并遵循指定命名规则
按指定文件数拆分压缩的Shell脚本修改方案
完整修改后代码
#!/bin/bash startd=$1 endd=$2 file_per_pack=${3:-200} # 第三个入参为单包最大文件数,未传时默认200 # 入参合法性校验 if [[ -z $startd || -z $endd ]]; then echo "用法: $0 开始日期 结束日期 [单包文件数]" echo "示例: $0 2021-10-01 2021-10-07 200" exit 1 fi compress () { local startd=$(date -d $startd +%Y%m%d) local endd=$(date -d $endd +%Y%m%d) local dirl="" while [[ $startd -le $endd ]] do local tempdate=$(date -d $startd +"%Y-%m-%d") dirl+=" $tempdate" startd=$(date -d"$startd + 1 day" +"%Y%m%d") done echo "待处理日期目录: $dirl" for j in $dirl do if [ -d "$j" ]; then cd $j || continue # 遍历当前日期目录下的所有国家子目录 for d in */ do d=${d%/} # 去除目录末尾的/符号 # 读取国家目录下所有文件存入数组 files=($d/*) total_files=${#files[@]} if [[ $total_files -eq 0 ]]; then echo "目录 $j/$d 下无有效文件,跳过打包" continue fi echo "开始处理 $j/$d,共 $total_files 个文件,每 $file_per_pack 个打包" # 按指定数量切片分组打包 for ((i=0; i<total_files; i+=file_per_pack)) do pack_index=$((i / file_per_pack)) # 第一组压缩包无序号,后续分组序号从1开始递增 if [[ $pack_index -eq 0 ]]; then pack_suffix="" else pack_suffix=$pack_index fi pack_name="${j}_${d}${pack_suffix}.zip" # 压缩包直接生成到根目录,屏蔽zip默认输出日志 zip ../${pack_name} ${files[@]:i:file_per_pack} > /dev/null 2>&1 echo "已生成压缩包: $pack_name" done done cd .. else echo "日期目录 $j 不存在,跳过处理" fi done } # 执行压缩逻辑 compress
关键修改说明
- 新增第三个可选入参,支持自定义单压缩包的最大文件数,未传参时默认值为200,增加入参合法性校验逻辑
- 替换原有全量打包逻辑,改用数组存储国家目录下的所有文件,按指定数量切片分组
- 严格匹配命名规则:第一组压缩包无序号,后续分组序号从1开始递增
- 优化压缩包输出逻辑,直接生成到根目录,无需额外移动操作
- 增加空目录判断逻辑,避免无文件时报错
如果你需要压缩包内不保留国家目录层级、只存源文件,可将zip执行部分替换为以下代码:
cd $d zip ../../${pack_name} $(ls | sed -n "$((i+1)),$((i+file_per_pack))p") > /dev/null 2>&1 cd ..
使用示例
执行以下命令即可处理2021-10-01到2021-10-02的所有目录,每200个文件打一个压缩包:./compress.sh 2021-10-01 2021-10-02 200
内容的提问来源于stack exchange,提问作者NVNK
相关产品推荐
相关产品推荐

