
在数字时代,文件传输和存储过程中可能会遭遇各种意外情况:网络传输错误、存储介质损坏、恶意篡改等。这些风险可能导致关键文件损坏或内容被修改,进而引发严重后果。文件完整性校验技术应运而生,成为确保数据安全的必要手段。
MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希算法,能够为任意长度的数据生成唯一的128位哈希值。虽然MD5在密码学领域已不再安全,但在文件完整性校验方面,它仍然是一个简单有效的工具。
一、md5sum工具
md5sum 是 Linux 和 Unix 类系统(如 Ubuntu)中一个经典且强大的命令行工具,其核心功能是计算并验证文件的 MD5 哈希值。MD5 哈希如同一份文件的"数字指纹",任何微小的内容改动都会导致其哈希值发生剧烈变化。通过比较文件当前生成的 MD5 值与之前记录的原始值,md5sum 能够高效、准确地判断文件在传输、存储或备份过程中是否保持了完整性,即是否未被意外损坏或恶意篡改。
1. 生成单个文件的MD5校验值
若您希望在终端中直接查看某个文件的MD5哈希值,可以使用以下命令,它将输出一个128位的哈希值与对应的文件名:
bash
# 生成文件的MD5值并显示在终端
md5sum filename.txt

如果您需要将生成的MD5校验值保存下来以供后续使用,可以将输出重定向至一个文件,这样会创建一个便于日后校验的MD5记录文件:
bash
# 将MD5值保存到文件
md5sum filename.txt > checksum.md5

2. 校验文件完整性
当您拥有一个已存储MD5值的校验文件时,可以使用以下命令批量校验对应文件的完整性,系统会自动比对当前文件的MD5值与记录是否一致:
bash
# 使用保存的MD5文件校验
md5sum -c checksum.md5

3. 批量处理文件
若要为某个目录下的所有文件生成MD5校验值,可以结合find命令实现批量生成,结果将统一保存到一个汇总文件中:
bash
# 生成目录下所有文件的MD5值
find /home/bjxia/demo -type f -exec md5sum {} \; > all_checksums.md5

同样,也可以基于上述生成的汇总文件,对目录中的所有文件进行一次完整的批量校验,确保大量文件的完整性状态一目了然:
bash
# 批量校验
md5sum -c all_checksums.md5

4. 批量处理文件
在实际项目中,我们经常需要排除一些临时或自动生成的目录,例如node_modules或build文件夹,这时可以在find命令中加入排除参数,使生成的MD5记录更加简洁和准确:
bash
find /home/bjxia/demo -type f -not -path "*/node_modules/*" -not -path "*/build/*" -exec md5sum {} \; > checksums.md5
二、自动化脚本
通过编写脚本,我们可以将校验流程自动化,提高工作效率。
以下是完整自动化校验脚本,展示了如何将md5sum的功能封装成易于使用的工具。该脚本包含生成、校验、自动排除目录、路径配置等功能,适合集成到日常的文件管理或部署流程中:
bash
#!/bin/bash
# 指定脚本解释器为bash,确保在不同系统上都能正确执行
# check_integrity.sh - 自动化校验流程
# 脚本功能描述:用于生成和校验文件的MD5哈希值以确保文件完整性
# 要计算MD5的文件夹:需要计算MD5哈希的源文件夹路径
BASE_DIR="/home/bjxia/demo"
# 要排除的文件夹:用空格分隔多个文件夹名
EXCLUDE_DIRS="cmake-build-debug cmake-build-release .idea"
# MD5输出文件夹:保存MD5校验文件的目录路径
MD5_DIR="/home/bjxia/checksums"
# MD5输出文件名称:MD5校验文件的完整路径和文件名
MD5_FILE="$MD5_DIR/md5_checksums.txt"
# 要验证的md5文件名称:
VERIFY_SCRIPT="$MD5_DIR/md5_checksums.txt"
# 创建MD5输出文件夹,-p参数确保如果目录不存在则创建,存在则不报错
mkdir -p "$MD5_DIR"
# 函数:生成MD5
generate_md5() {
echo "正在生成MD5校验和..."
echo "源目录: $BASE_DIR"
echo "排除目录: $EXCLUDE_DIRS"
# 确保MD5文件的父目录存在,dirname命令获取目录路径部分
mkdir -p $(dirname "$MD5_FILE")
# > 重定向操作符:清空文件内容(如果文件不存在则创建空文件)
> "$MD5_FILE"
# 构建排除参数
exclude_params=""
for dir in $EXCLUDE_DIRS; do
exclude_params="$exclude_params -not -path \"*/$dir/*\""
done
# 生成MD5
eval "find \"$BASE_DIR\" -type f $exclude_params -exec md5sum {} \;" > "$MD5_FILE"
# 统计并输出生成的文件数量
# wc -l:计算文件行数,每行对应一个文件的MD5信息
# < "$MD5_FILE":将文件内容作为wc命令的输入
COUNT=$(wc -l < "$MD5_FILE")
echo "已生成 $COUNT 个文件的MD5校验和"
echo "保存到: $MD5_FILE"
}
# 函数:校验MD5
verify_md5() {
echo "正在校验文件完整性..."
if [ ! -f "$MD5_FILE" ]; then
echo "错误: MD5文件不存在,请先生成MD5"
return 1
fi
# 切换到源文件所在的目录
cd "$BASE_DIR"
# 执行校验并显示结果
# md5sum -c:根据MD5文件校验对应文件的完整性
# 2>&1:将标准错误(stderr)重定向到标准输出(stdout),统一显示
md5sum -c "$MD5_FILE" 2>&1
# 检查结果
# $? 获取上一条命令(md5sum)的退出状态码
# -eq 0:检查是否等于0(0表示成功,非0表示失败)
if [ $? -eq 0 ]; then
# 输出空行,使显示更美观
echo ""
# 显示校验成功的提示信息
echo "✓ 所有文件完整性校验通过!"
# 返回0表示函数执行成功
return 0
else
# 输出空行,使显示更美观
echo ""
# 显示校验失败的警告信息
echo "⚠ 文件完整性校验失败!"
# 输出空行,使显示更美观
return 1
fi
}
# 主菜单
echo "文件完整性管理工具"
echo "=================="
echo "1. 生成MD5校验和"
echo "2. 校验文件完整性"
echo "3. 重新生成并校验"
echo "请选择操作 (1-3): "
read choice
case $choice in
1)
generate_md5
;;
2)
verify_md5
;;
3)
generate_md5
verify_md5
;;
*)
echo "无效选择"
exit 1
;;
esac
批量生成MD5校验和:

批量校验MD5校验和:
