本文目录导读:

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
特点说明
- 内存优化:使用分块读取,适合大文件
- 多算法支持:可同时计算 MD5、SHA1、SHA256
- 错误处理:包含文件不存在等异常处理
- 批量处理:可处理整个目录
- 输出格式:简洁清晰的格式化输出
选择哪种方法取决于你的操作系统和使用场景,Linux/Mac 推荐使用 Bash 或 Python,Windows 推荐使用 PowerShell 或 Python。