CLI AI

把大文件切成几块,再拼回去

2026-07-28

split -b 10M -d archive.tar.gz archive.tar.gz.part- 把文件切成 10 MB 的小块,cat archive.tar.gz.part-* > restored.tar.gz 再把它们拼回去。大小一致什么都证明不了——唯一诚实的检查是比对校验和,而且有一个参数会在不报失败的情况下丢数据。

1. 按大小切分

clai
$ clai 把 archive.tar.gz 切成每块 10 兆→ split -b 10M -d archive.tar.gz archive.tar.gz.part-10485760 archive.tar.gz.part-0010485760 archive.tar.gz.part-014028480 archive.tar.gz.part-02

-b 10M 是每块的大小,-d 要求用数字后缀而不是字母。最后一块更小,这是正常的。命令本身没有输出——上面的大小来自 ls -l。

2. 拼回去

clai
$ clai 用这些分块把文件拼回来→ cat archive.tar.gz.part-* > restored.tar.gz

并不存在什么"unsplit"命令:全部窍门就是按通配符顺序 cat。这正是后缀重要的原因——split 生成的数字和字母后缀总能排出正确的顺序。

3. 证明结果完全一致

clai
$ clai 检查拼回来的文件和原始文件是否一致→ sha256sum archive.tar.gz restored.tar.gz93f9298124fc680c archive.tar.gz93f9298124fc680c restored.tar.gz

这里的哈希截断到 16 个字符以便放进一行。文件大小相同不构成证据:块内部翻转一个字节,大小完全不变。

4. 按份数切,而不是按大小

clai
$ clai 把文件正好切成三份→ split -n 3 -d archive.tar.gz piece-8333334 piece-008333333 piece-018333333 piece-02

-n 会切成大小相等的几份,余数给第一份。当你要把文件分散到三块硬盘上、而不是塞进上传限额时很好用。

5. 给拼接的人留一个校验和

clai
$ clai 把校验和保存在文件旁边→ sha256sum archive.tar.gz > archive.tar.gz.sha256

拼好之后,对方执行 sha256sum -c archive.tar.gz.sha256,得到 archive.tar.gz: OK。文件损坏时会打印 archive.tar.gz: FAILED 和 sha256sum: WARNING: 1 computed checksum did NOT match,退出码为 1——通过翻转第二块里的一个字节验证过。

6. 陷阱:固定长度的后缀

clai
$ clai 把文件切成 200KB 一块,后缀用两位数字→ split -b 200k -d -a 2 archive.tar.gz fixed-split: output file suffixes exhausted⚠ CAUTION — 文件缺了一部分,退出码却仍是 0

已验证:-a 2 只允许 100 个名字,而这个文件需要 123 块,于是 split 写了 100 个文件、打印错误,然后照样以 0 退出。不加 -a 时它会自己延长后缀——名字依次是 small-00…small-89,接着是 small-9000——拼接顺序依然正确,哈希可以佐证。

Gotchas

  • 大小相同什么都证明不了。 唯一诚实的判据是原文件的校验和与拼回文件的校验和。
  • -a 固定长度会悄悄丢数据。 错误是打印了,但退出码是 0,于是脚本会心安理得地带着残缺的分块继续跑。要么别用 -a,要么提前算好块数。
  • 一块不是一个压缩包。 archive.tar.gz.part-00 是压缩包的前三分之一,不是一个小压缩包。先拼后解压;对单独一块运行 tar 只会抱怨文件意外结束。

Related questions

怎么按行切而不是按字节? split -l 100000 big.csv part- 会在行边界切开,处理文本和日志时正需要这个。

split 能顺便压缩吗? 不能——先 tar czf,再切分做好的压缩包。顺序反过来会得到任何工具都读不了的碎块。

如果对方用 Windows 呢? 那边用 copy /b part-00+part-01+part-02 archive.tar.gz 拼接,列表里的顺序才是关键。

See also

CliAI 会根据一句话写出切分、拼接和校验三条命令,并在每条执行前先显示出来。一行安装。