Post

大文件分段压缩与完整性校验的实战流程

大文件分段压缩与完整性校验的实战流程

在跨网络传输或设备容量受限的场景中,我们常常需要将一个 超大文件(如 40GB)分割为小文件,传输后再恢复为原文件。为了保证 数据完整性和安全性,本文介绍一种完整的分割与恢复流程,包括:

  • 如何将大文件按 3.9GB 分段
  • 如何对每个分段生成哈希校验文件
  • 如何在目标机器上自动重组并验证数据完整性

📌 应用场景举例

  • 发文件给同事,但 U 盘或邮箱限制单文件大小
  • 上传至某些平台(如 OSS、Google Drive)有分片要求
  • 网络不稳定,分段更便于断点续传与重传
  • 精准控制传输过程中的数据一致性

📂 分割+校验流程(发送方)

1. 原始文件准备

我们以 gds.gz 文件为例。

2. 执行分割与哈希脚本

新建一个脚本 split_and_hash.sh,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
set -e

INPUT_FILE="gds.gz"
SPLIT_PREFIX="gds.gz.part_"
SPLIT_SIZE="3900m"
SUFFIX_LENGTH=3

echo "[INFO] 清理旧文件..."
rm -f ${SPLIT_PREFIX}* "${INPUT_FILE}.sha256"

echo "[INFO] 计算原始文件哈希..."
sha256sum "$INPUT_FILE" > "${INPUT_FILE}.sha256"

echo "[INFO] 分割为每段 $SPLIT_SIZE ..."
split -b "$SPLIT_SIZE" --numeric-suffixes=0 --suffix-length=$SUFFIX_LENGTH "$INPUT_FILE" "$SPLIT_PREFIX"

echo "[INFO] 为每段生成 SHA256..."
for part in ${SPLIT_PREFIX}*; do
    sha256sum "$part" > "$part.sha256"
done

echo "[DONE] 共生成 $(ls ${SPLIT_PREFIX}* | wc -l) 段文件及对应哈希"

执行:

1
bash split_and_hash.sh

3. 发送这些文件给接收方:

  • gds.gz.part_000, gds.gz.part_001, …
  • 每个对应的 .sha256 文件
  • 原始文件的 gds.gz.sha256

🔁 拼接+验证流程(接收方)

新建恢复脚本 rebuild_and_verify.sh,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/bash
set -e

INPUT_PREFIX="gds.gz.part_"
OUTPUT_FILE="gds.gz"
ORIGINAL_HASH_FILE="gds.gz.sha256"
REBUILT_HASH_FILE="reconstructed.sha256"

echo "[INFO] 校验每个分段 SHA256..."
for part in ${INPUT_PREFIX}*; do
    if ! sha256sum -c "${part}.sha256"; then
        echo "[ERROR] ❌ 校验失败: $part"
        exit 1
    fi
done

echo "[INFO] 所有分段校验通过 ✅"

echo "[INFO] 拼接恢复 $OUTPUT_FILE ..."
cat ${INPUT_PREFIX}* > "$OUTPUT_FILE"

echo "[INFO] 计算恢复后文件哈希..."
sha256sum "$OUTPUT_FILE" > "$REBUILT_HASH_FILE"

if cmp -s "$REBUILT_HASH_FILE" "$ORIGINAL_HASH_FILE"; then
    echo "[SUCCESS] ✅ 恢复成功,文件完整"
else
    echo "[ERROR] ❌ 哈希不一致,可能文件损坏"
    diff "$REBUILT_HASH_FILE" "$ORIGINAL_HASH_FILE"
fi

执行:

1
bash rebuild_and_verify.sh

🔄 流程图(文字版)

发送端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[开始] 
   │
   ▼
[原始文件 gds.gz]
   │
   ▼
[计算 gds.gz 的 SHA256 → 保存为 gds.gz.sha256]
   │
   ▼
[使用 split 切割为每段 3.9GB → 生成 gds.gz.part_000, gds.gz.part_001, ...]
   │
   ▼
[对每个分段计算 SHA256 → 生成 gds.gz.part_000.sha256, ...]
   │
   ▼
[打包以下文件发送给接收方]
   ├─ gds.gz.part_000, gds.gz.part_001, ...
   ├─ gds.gz.part_000.sha256, gds.gz.part_001.sha256, ...
   └─ gds.gz.sha256

接收端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[开始]
   │
   ▼
[接收到所有分段文件和校验文件]
   │
   ▼
[逐个校验 gds.gz.part_*.sha256]
   │
   ├─ 如果校验失败 → [终止,提示错误 ❌]
   └─ 校验通过 → 继续
   ▼
[cat 拼接所有分段 → 还原为 gds.gz]
   │
   ▼
[对还原后的 gds.gz 重新计算 SHA256 → 与 gds.gz.sha256 比较]
   │
   ├─ 一致 → [✅ 恢复成功,文件完整]
   └─ 不一致 → [❌ 提示恢复失败,数据可能损坏]

✅ 小结

步骤工具/命令
分割split -b 3900m --numeric-suffixes
计算哈希sha256sum
拼接cat gds.gz.part_* > gds.gz
校验一致性cmpdiff

🧰 附加建议

  • 所有 .sha256 文件可以批量打包为一个 .tar.gz 传输
  • 支持脚本扩展为自动上传(如 scp / rsync
  • 建议保留原始文件 hash,便于未来验证数据是否发生意外改动

如需 Windows PowerShell 或支持断点续传的传输方案(如 aria2, rsync, curl 配合分片),欢迎留言或私信交流。

🚀 喜欢本文的欢迎收藏、转发和关注!

```

This post is licensed under CC BY 4.0 by the author.

支持创作者

如果本文帮助到你,可以通过以下收款码支持我:

收款码

感谢你的支持!