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

使用--tape-length选项创建的分卷tar包解压时提示非法字节序列及归档损坏的解决求助

使用--tape-length选项创建的分卷tar包解压时提示非法字节序列及归档损坏的解决求助

哎,这种“备份图省事没测试,恢复时踩大坑”的经历太扎心了!别慌,咱们先搞清楚问题出在哪,再一步步解决。

首先说问题根源:你用的--tape-length参数本来是给磁带备份设计的,它会严格按照指定大小切割归档文件,但完全不管正在打包的文件是不是刚好到结尾——也就是说,那些4GB以上的MP4文件被硬生生劈成了好几段,分别塞进不同的tar包。当你解压时,tar读到一段不完整的文件头/数据,就会抛出“非法字节序列”“损坏的归档”这类错误,tarcat本质也是拼接后给tar处理,所以同样报错。

下面给你几个可行的解决办法,按优先级试试:

1. 用正确的方式拼接并解压(GNU tar专属)

GNU tar本身支持直接处理这种分卷包,不用第三方工具,直接按顺序拼接后解压就行:

# 方式一:先拼接成完整归档再解压
tar --concatenate --file=full-backup.tar backup-000.tar backup-001.tar ...
tar xvf full-backup.tar

# 方式二:直接管道拼接解压(更高效,省磁盘空间)
cat backup-*.tar | tar xvf -

⚠️ 重点:一定要按文件名的顺序拼接(比如000、001、002...),乱序的话肯定会报错!

2. 强制用ASCII编码处理,规避字节序列问题

如果上面的方法还是报“非法字节序列”,大概率是你的系统 locale 设置导致tar对某些字节的识别出了问题。试试强制用C locale来处理:

LC_ALL=C cat backup-*.tar | tar xvf -

或者先拼接再解压:

LC_ALL=C tar --concatenate --file=full-backup.tar backup-*.tar
LC_ALL=C tar xvf full-backup.tar

3. 应急恢复单个跨卷大文件

如果上面的方法都不行,或者你只需要恢复某个特定的大MP4,可以手动提取片段再拼接:

  1. 先定位这个大文件在哪些tar包里:
for tarfile in backup-*.tar; do
    echo "检查 $tarfile..."
    tar tf "$tarfile" | grep "你的大文件.mp4"
done
  1. 从每个包含该文件片段的tar包里导出片段(用--to-stdout避免文件名冲突):
tar xf backup-000.tar "你的大文件.mp4" --to-stdout > part000.mp4
tar xf backup-001.tar "你的大文件.mp4" --to-stdout > part001.mp4
# 有多少个片段就执行多少条
  1. 拼接片段得到完整文件:
cat part000.mp4 part001.mp4 > "你的大文件.mp4"

最后给你个教训(别嫌啰嗦😂)

以后创建分卷备份时,尽量用更适合文件系统的方式:

  • 用GNU tar的-M/--multi-volume参数,它会智能处理跨卷文件:
tar cvf backup.tar -M --tape-length=4G /mnt/videofiles/
  • 或者先打包成单个tar,再用split分割:
tar cvf - /mnt/videofiles/ | split -b 4G - backup-

这两种方式解压时都能用cat backup-* | tar xvf -轻松搞定,不会踩这次的坑。

备注:内容来源于stack exchange,提问作者Gabrie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 09:18:10