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
我有两个文件名相同的文件夹。如何在 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