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

如何用小文件重现zip命令的分卷文件未找到错误

解决两个问题:创建测试zip重现分卷错误 + Bash捕获zip校验错误

一、创建1GB左右的测试zip文件,重现「Could not find:AUDIOS.z01」错误

这个错误的核心是zip文件头部被标记为分卷压缩的后续文件,导致zip -T校验时尝试寻找前序分卷文件(.z01)。按以下步骤生成测试文件:

  1. 生成1GB测试源文件

    dd if=/dev/zero of=source_file bs=1G count=1
    # 若嫌1G太大,可改为bs=100M count=10生成1GB文件
    
  2. 生成普通zip文件

    zip test.zip source_file
    
  3. 修改zip头部的分卷标志,伪装成分卷后续文件
    zip的本地文件头中,偏移量为6(0-based)的字节是分卷标志位:普通zip该字节为00,分卷文件会置第0位为1。我们需要修改这个标志位,让zip -T认为当前文件是分卷序列的一部分,需要寻找前序的.z01文件:

    • 转存zip为十六进制文本:
      xxd test.zip > test.hex
      
    • 用文本编辑器打开test.hex,找到第1行的第7个字节(对应偏移6),将原字节(通常是00)改为01
    • 转回二进制zip文件并重命名:
      xxd -r test.hex > AUDIOS.zip
      rm test.hex test.zip source_file  # 清理临时文件
      
  4. 验证错误
    执行zip -T AUDIOS.zip,会输出:

    Could not find:AUDIOS.z01
    error: zip file corrupt

    同时用7z解压测试:7z x AUDIOS.zip,会提示头部错误但能正常解压文件。

二、修改Bash代码捕获指定错误

要捕获zip -T的特定错误,可通过捕获命令输出+退出码的方式实现,无需依赖大文件测试:

方案1:精准匹配错误信息

# 执行zip校验并捕获所有输出(包括stderr)
check_output=$(zip -T AUDIOS.zip 2>&1)
exit_status=$?

# 检查是否包含目标错误字符串
if [[ "$check_output" == *"Could not find:AUDIOS.z01"* ]]; then
    echo "已捕获目标分卷错误: $check_output"
    # 这里添加你的后续处理逻辑(无需修复,仅记录/标记即可)
elif [ $exit_status -ne 0 ]; then
    echo "捕获到其他zip校验错误: $check_output"
else
    echo "zip文件校验通过"
fi

方案2:简化版(仅检测目标错误)

如果只需要检测是否出现该特定错误,可直接用grep过滤:

if zip -T AUDIOS.zip 2>&1 | grep -q "Could not find:AUDIOS.z01"; then
    echo "成功捕获到分卷缺失错误"
    # 后续处理逻辑
fi

注:2>&1是将stderr重定向到stdout,确保错误信息能被捕获;grep -q只返回匹配状态,不输出内容。

内容的提问来源于stack exchange,提问作者Christian David Sierra Martnez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:05:25