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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:54:03