如何用小文件重现zip命令的分卷文件未找到错误
解决两个问题:创建测试zip重现分卷错误 + Bash捕获zip校验错误
一、创建1GB左右的测试zip文件,重现「Could not find:AUDIOS.z01」错误
这个错误的核心是zip文件头部被标记为分卷压缩的后续文件,导致zip -T校验时尝试寻找前序分卷文件(.z01)。按以下步骤生成测试文件:
生成1GB测试源文件
dd if=/dev/zero of=source_file bs=1G count=1 # 若嫌1G太大,可改为bs=100M count=10生成1GB文件生成普通zip文件
zip test.zip source_file修改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 # 清理临时文件
- 转存zip为十六进制文本:
验证错误
执行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
相关产品推荐
相关产品推荐

