在一行中生成/验证校验和?

在一行中生成/验证校验和?

当我为文件生成校验和时,我必须做一些额外的工作才能正确设置它们的格式:

CHECKSUM="$(shasum "$file" | cut -b 1-40)"
echo -n "$CHECKSUM" > "$file.sha"

这是为了确保在文件中,我只有校验和本身(因此cut),并且在文件末尾没有换行符(因此echo -n)。

验证校验和还需要一些额外的工作:

CHECKSUM="$(shasum "$file" | cut -b 1-40)"
echo -n "$CHECKSUM" | diff - "$file.sha"

是否有一种更简单、更紧凑的方法来创建和验证校验和而不存储路径?我不喜欢将路径与文件一起存储在校验和中,因为这使得文件在我看来不太可移植。

答案1

一个明显的小改进

CHECKSUM="$(shasum "$file" | cut -b 1-40)"
echo -n "$CHECKSUM" > "$file.sha"

是:

shasum "$file" | cut -b 1-40 >"$file.sha"

cut可以使用 `awk 避免尾随换行符:

shasum "$file" | awk -v ORS="" '{print $1}'

更简单的形式

CHECKSUM="$(shasum "$file" | cut -b 1-40)"
echo -n "$CHECKSUM" | diff - "$file.sha"

是:

if [ "$(shasum "$file" | cut -b 1-40)" = "$(<"$file.sha")" ]; then ...

相关内容