ubuntu 中的校验和 bash 脚本

checksum bash script in ubuntu

我有两个文件名相同的文件夹。如何在 bash 中执行校验和以评估哪些文件不同或相同?目前,我在下面编写了一个 bash 脚本,该脚本构建相应的文件名并对它们执行“cksum”,每个校验和生成两个数字。但是我必须以某种方式为每条记录保存这两个数字,然后将它们相减以查看哪个不匹配。

#!/bin/bash
folderOld="home/OldFiles/"
folderNew="home/NewFiles/"
for ((fileNumber=1;fileNumber<1000000;fileNumber++))
do
FileName="file${fileNumber}.dat"
OldFile=$folderOld$FileName
NewFile=$folderNew$FileName
cksum $OldFile
cksum $NewFile
done

你不需要减去数字,你只需要检查它们是否相等:

OldSum=$(cksum $OldFile | cut -d' ' -f1)
NewSum=$(cksum $NewFile | cut -d' ' -f1)
if [[ $OldSum != $NewSum ]]; then
    # Checksum mismatch, do something useful here
fi

我在这里使用 cut -d' ' -f1 在空格上拆分行,并取第一个字段。所以忽略文件大小和文件名。

顺便说一下,cksum 默认使用 CRC32,这在很多文件上都有误报的风险。最好使用,例如 sha256sum.

如果您只需要知道文件是否不同,则无需计算校验和。使用 diff:

#!/usr/bin/env bash

folderOld="home/OldFiles/"
folderNew="home/NewFiles/"
for ((fileNumber = 1; fileNumber < 1000000; fileNumber++)); do
  FileName="file${fileNumber}.dat"
  if diff -q "$folderOld$FileName" "$folderNew$FileName" >/dev/null; then
    printf 'File %s is same in %s and %s\n' "$FileName" "$folderOld" "$folderNew"
  else
    printf 'File %s differs in %s and %s\n' "$FileName" "$folderOld" "$folderNew"
  fi
done
for i in {1..999999}; do
    cmp {old/dir,new/dir}"/file$i.dat" || echo "file$i.dat: no match"
done