怎么用脚本生成文件校验码

wen 实用脚本 2

本文目录导读:

怎么用脚本生成文件校验码

  1. Linux/Mac 命令行脚本 (Bash)
  2. Python 脚本
  3. PowerShell 脚本 (Windows)
  4. 批量处理脚本 (Python)
  5. 使用 openssl 命令 (Linux)
  6. 使用示例
  7. 特点说明

Linux/Mac 命令行脚本 (Bash)

#!/bin/bash
# 计算文件的 MD5, SHA1, SHA256
FILE=$1
echo "=== 文件校验码 ==="
echo "文件: $FILE"
echo ""
# MD5
md5sum "$FILE"
echo ""
# SHA1
sha1sum "$FILE"
echo ""
# SHA256
sha256sum "$FILE"

Python 脚本

#!/usr/bin/env python3
import hashlib
import sys
def calculate_checksums(filepath):
    """计算文件的多种校验码"""
    # 分块读取,适用于大文件
    file_hash_md5 = hashlib.md5()
    file_hash_sha1 = hashlib.sha1()
    file_hash_sha256 = hashlib.sha256()
    with open(filepath, 'rb') as f:
        # 每次读取8KB
        for chunk in iter(lambda: f.read(8192), b''):
            file_hash_md5.update(chunk)
            file_hash_sha1.update(chunk)
            file_hash_sha256.update(chunk)
    return {
        'MD5': file_hash_md5.hexdigest(),
        'SHA1': file_hash_sha1.hexdigest(),
        'SHA256': file_hash_sha256.hexdigest()
    }
if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("用法: python checksum.py <文件名>")
        sys.exit(1)
    filepath = sys.argv[1]
    try:
        results = calculate_checksums(filepath)
        print(f"\n文件: {filepath}")
        print(f"文件大小: {os.path.getsize(filepath)} 字节")
        print("=" * 50)
        for algo, checksum in results.items():
            print(f"{algo}: {checksum}")
    except FileNotFoundError:
        print(f"错误: 文件 {filepath} 不存在")
        sys.exit(1)
    except Exception as e:
        print(f"错误: {e}")
        sys.exit(1)

PowerShell 脚本 (Windows)

# calculate-checksum.ps1
param(
    [Parameter(Mandatory=$true)]
    [string]$FilePath,
    [ValidateSet("MD5", "SHA1", "SHA256", "All")]
    [string]$Algorithm = "All"
)
function Get-Checksum {
    param(
        [string]$FilePath,
        [string]$Algorithm
    )
    $hash = Get-FileHash -Path $FilePath -Algorithm $Algorithm
    return $hash.Hash
}
if (Test-Path $FilePath) {
    $fileInfo = Get-Item $FilePath
    Write-Host "文件: $FilePath" -ForegroundColor Green
    Write-Host "大小: $($fileInfo.Length) 字节" -ForegroundColor Green
    Write-Host "=" * 50
    switch ($Algorithm) {
        "MD5" {
            $md5 = Get-Checksum $FilePath "MD5"
            Write-Host "MD5: $md5"
        }
        "SHA1" {
            $sha1 = Get-Checksum $FilePath "SHA1"
            Write-Host "SHA1: $sha1"
        }
        "SHA256" {
            $sha256 = Get-Checksum $FilePath "SHA256"
            Write-Host "SHA256: $sha256"
        }
        "All" {
            $md5 = Get-Checksum $FilePath "MD5"
            $sha1 = Get-Checksum $FilePath "SHA1"
            $sha256 = Get-Checksum $FilePath "SHA256"
            Write-Host "MD5:    $md5"
            Write-Host "SHA1:   $sha1"
            Write-Host "SHA256: $sha256"
        }
    }
} else {
    Write-Host "错误: 文件不存在" -ForegroundColor Red
}

批量处理脚本 (Python)

#!/usr/bin/env python3
import hashlib
import os
import json
from pathlib import Path
def calculate_file_hash(filepath, algorithm='sha256'):
    """计算单个文件的校验码"""
    hash_func = hashlib.new(algorithm)
    with open(filepath, 'rb') as f:
        for chunk in iter(lambda: f.read(8192), b''):
            hash_func.update(chunk)
    return hash_func.hexdigest()
def generate_checksums(directory, algorithms=['md5', 'sha1', 'sha256']):
    """批量计算目录下所有文件的校验码"""
    checksums = {}
    for filepath in Path(directory).rglob('*'):
        if filepath.is_file():
            file_checksums = {}
            for algo in algorithms:
                file_checksums[algo] = calculate_file_hash(str(filepath), algo)
            checksums[str(filepath)] = file_checksums
    return checksums
if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser(description="批量生成文件校验码")
    parser.add_argument("path", help="文件或目录路径")
    parser.add_argument("-o", "--output", help="输出JSON文件")
    parser.add_argument("-a", "--algorithms", 
                       nargs="+", 
                       default=['md5', 'sha1', 'sha256'],
                       help="选择算法 (如 -a md5 sha1 sha256)")
    args = parser.parse_args()
    if os.path.isdir(args.path):
        results = generate_checksums(args.path, args.algorithms)
        print(f"共找到 {len(results)} 个文件")
    elif os.path.isfile(args.path):
        checksums = {}
        for algo in args.algorithms:
            checksums[algo] = calculate_file_hash(args.path, algo)
        results = {args.path: checksums}
    else:
        print(f"错误: {args.path} 不存在")
        exit(1)
    # 输出结果
    if args.output:
        with open(args.output, 'w') as f:
            json.dump(results, f, indent=2)
        print(f"结果已保存到: {args.output}")
    else:
        for filepath, checksums in results.items():
            print(f"\n文件: {filepath}")
            for algo, checksum in checksums.items():
                print(f"  {algo.upper()}: {checksum}")

使用 openssl 命令 (Linux)

#!/bin/bash
# 使用openssl计算校验码
FILE=$1
ALGORITHM="SHA256"  # 可改为 MD5, SHA1, SHA256
if [ -f "$FILE" ]; then
    openssl dgst -"$ALGORITHM" "$FILE"
else
    echo "文件不存在"
    exit 1
fi

使用示例

Python 脚本使用方法:

# 生成单个文件校验码
python3 checksum.py /path/to/file
# 批量生成
python3 generate_checksums.py /path/to/directory -o checksums.json

Bash 脚本使用方法:

# 添加执行权限
chmod +x checksum.sh
# 运行
./checksum.sh /path/to/file

PowerShell 使用方法:

# 运行
.\calculate-checksum.ps1 -FilePath "C:\test\file.zip" -Algorithm All

特点说明

  1. 内存优化:使用分块读取,适合大文件
  2. 多算法支持:可同时计算 MD5、SHA1、SHA256
  3. 错误处理:包含文件不存在等异常处理
  4. 批量处理:可处理整个目录
  5. 输出格式:简洁清晰的格式化输出

选择哪种方法取决于你的操作系统和使用场景,Linux/Mac 推荐使用 Bash 或 Python,Windows 推荐使用 PowerShell 或 Python。

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