脚本如何实现文件内容校验功能

wen 实用脚本 1

本文目录导读:

脚本如何实现文件内容校验功能

  1. MD5/SHA校验(最常用)
  2. CRC32校验(速度快)
  3. 文件大小+内容校验
  4. 高级校验脚本(包含多种校验)
  5. 批处理校验多个文件
  6. 使用建议

MD5/SHA校验(最常用)

Bash脚本示例

#!/bin/bash
# 计算文件MD5值
md5_value=$(md5sum "$1" | cut -d' ' -f1)
echo "MD5: $md5_value"
# 计算文件SHA256值
sha256_value=$(sha256sum "$1" | cut -d' ' -f1)
echo "SHA256: $sha256_value"
# 与预期值比较
expected_md5="d41d8cd98f00b204e9800998ecf8427e"
if [ "$md5_value" = "$expected_md5" ]; then
    echo "文件校验通过!"
else
    echo "文件校验失败!"
fi

Python脚本示例

import hashlib
import sys
def calculate_hash(filename, algorithm='md5'):
    """计算文件哈希值"""
    hash_obj = hashlib.new(algorithm)
    with open(filename, 'rb') as f:
        # 分块读取大文件
        for chunk in iter(lambda: f.read(4096), b''):
            hash_obj.update(chunk)
    return hash_obj.hexdigest()
# 使用示例
if __name__ == "__main__":
    filename = sys.argv[1]
    md5 = calculate_hash(filename, 'md5')
    sha256 = calculate_hash(filename, 'sha256')
    print(f"MD5: {md5}")
    print(f"SHA256: {sha256}")

CRC32校验(速度快)

使用Python的zlib

import zlib
import sys
def calculate_crc32(filename):
    """计算文件CRC32值"""
    with open(filename, 'rb') as f:
        crc = 0
        for chunk in iter(lambda: f.read(4096), b''):
            crc = zlib.crc32(chunk, crc)
    return format(crc & 0xFFFFFFFF, '08x')
# 使用示例
crc32 = calculate_crc32('example.txt')
print(f"CRC32: {crc32}")

文件大小+内容校验

import os
import hashlib
import json
class FileValidator:
    """文件校验器"""
    def __init__(self, filepath):
        self.filepath = filepath
        self.file_info = {}
    def check_size(self, expected_size=None):
        """检查文件大小"""
        actual_size = os.path.getsize(self.filepath)
        self.file_info['size'] = actual_size
        if expected_size and actual_size != expected_size:
            return False
        return True
    def check_content(self, algorithm='sha256'):
        """检查文件内容"""
        hash_value = hashlib.new(algorithm)
        with open(self.filepath, 'rb') as f:
            for chunk in iter(lambda: f.read(8192), b''):
                hash_value.update(chunk)
        self.file_info['hash'] = hash_value.hexdigest()
        self.file_info['algorithm'] = algorithm
        return self.file_info['hash']
    def compare_with_checksum_file(self, checksum_file):
        """与校验文件比较"""
        with open(checksum_file, 'r') as f:
            expected_data = json.load(f)
        self.check_size()
        self.check_content(expected_data.get('algorithm', 'sha256'))
        return (self.file_info['hash'] == expected_data['hash'] and 
                self.file_info['size'] == expected_data['size'])
# 使用示例
validator = FileValidator('example.txt')
print(f"文件大小: {validator.check_size()} bytes")
print(f"文件哈希: {validator.check_content('sha256')}")

高级校验脚本(包含多种校验)

#!/bin/bash
# 多功能文件校验脚本
validate_file() {
    local file="$1"
    local checksum_file="$2"
    echo "📁 文件: $file"
    # 检查文件是否存在
    if [ ! -f "$file" ]; then
        echo "❌ 文件不存在!"
        return 1
    fi
    # 获取文件信息
    local size=$(stat -c%s "$file")
    local mod_time=$(stat -c%y "$file")
    echo "📊 文件大小: $size 字节"
    echo "🕐 修改时间: $mod_time"
    # 计算各种哈希值
    echo "🔐 哈希值:"
    echo "  MD5:    $(md5sum "$file" | cut -d' ' -f1)"
    echo "  SHA1:   $(sha1sum "$file" | cut -d' ' -f1)"
    echo "  SHA256: $(sha256sum "$file" | cut -d' ' -f1)"
    # 如果有校验文件,进行比对
    if [ -f "$checksum_file" ]; then
        echo "📋 与校验文件比对:"
        if sha256sum --check "$checksum_file" 2>/dev/null; then
            echo "✅ 文件校验通过!"
        else
            echo "❌ 文件校验失败!"
        fi
    fi
}
# 生成校验文件
generate_checksum() {
    local file="$1"
    local output="${2:-checksum.sha256}"
    sha256sum "$file" > "$output"
    echo "✅ 校验文件已生成: $output"
}
# 主函数
main() {
    case "${1:-help}" in
        check)
            validate_file "$2" "$3"
            ;;
        generate)
            generate_checksum "$2" "$3"
            ;;
        help|*)
            echo "用法: $0 {check|generate} <文件> [校验文件]"
            echo "  check <文件> [校验文件]    - 校验文件完整性"
            echo "  generate <文件> [输出文件] - 生成校验文件"
            ;;
    esac
}
main "$@"

批处理校验多个文件

import hashlib
import os
from multiprocessing import Pool
def verify_file(args):
    """验证单个文件的完整性"""
    filepath, expected_hash = args
    try:
        # 计算SHA256
        sha256 = hashlib.sha256()
        with open(filepath, 'rb') as f:
            for chunk in iter(lambda: f.read(8192), b''):
                sha256.update(chunk)
        actual_hash = sha256.hexdigest()
        is_valid = actual_hash == expected_hash
        return {
            'file': filepath,
            'expected': expected_hash,
            'actual': actual_hash,
            'valid': is_valid
        }
    except Exception as e:
        return {
            'file': filepath,
            'error': str(e),
            'valid': False
        }
def batch_verify(file_hashes):
    """批量校验文件"""
    with Pool(processes=4) as pool:
        results = pool.map(verify_file, file_hashes.items())
    # 统计结果
    passed = sum(1 for r in results if r.get('valid'))
    failed = sum(1 for r in results if not r.get('valid'))
    print(f"✅ 通过: {passed}, ❌ 失败: {failed}")
    # 输出失败的文件
    for r in results:
        if not r.get('valid'):
            print(f"  ❌ {r['file']}: {r.get('error', '哈希不匹配')}")
    return passed, failed
# 使用示例
file_hashes = {
    'file1.txt': 'abc123...',
    'file2.txt': 'def456...',
}
batch_verify(file_hashes)

使用建议

  1. 安全考虑:对于重要文件,建议使用SHA256或更强的哈希算法
  2. 性能优化:处理大文件时分块读取,避免内存溢出
  3. 错误处理:添加适当的异常处理,确保文件可读
  4. 自动化:可以集成到CI/CD流水线中
  5. 校验文件:将哈希值保存到单独的文件中,便于重复验证

选择哪种方法取决于你的具体需求:

  • 需要速度?使用CRC32
  • 需要安全?使用SHA256
  • 需要兼容?使用MD5(虽然不推荐用于安全场景)

抱歉,评论功能暂时关闭!