大文件分段压缩与完整性校验的实战流程
大文件分段压缩与完整性校验的实战流程
在跨网络传输或设备容量受限的场景中,我们常常需要将一个 超大文件(如 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 |
校验一致性 | cmp 或 diff |
🧰 附加建议
- 所有
.sha256
文件可以批量打包为一个.tar.gz
传输 - 支持脚本扩展为自动上传(如
scp
/rsync
) - 建议保留原始文件 hash,便于未来验证数据是否发生意外改动
如需 Windows PowerShell 或支持断点续传的传输方案(如 aria2
, rsync
, curl
配合分片),欢迎留言或私信交流。
🚀 喜欢本文的欢迎收藏、转发和关注!
```
This post is licensed under CC BY 4.0 by the author.