我有两个文件名相同的文件夹。如何在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
如果您只需要知道文件是否不同,则无需计算校验和。使用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 %sn' "$FileName" "$folderOld" "$folderNew"
else
printf 'File %s differs in %s and %sn' "$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
您不需要减去数字,只需要检查它们是否相等:
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
。