如何在 Linux 上根据文件名对文件进行校验

如何在 Linux 上根据文件名对文件进行校验

我在 Windows 计算机上有许多文件,文件名上带有 CRC 校验和标记。例如:

filename_[000000].extension

我知道基于 Linux 的系统有很多选项可以检查/计算 CRC 校验和,但我不知道有任何选项可以计算文件的校验和,然后通过重命名文件来“标记”该校验和,或者通过将计算结果与文件名上的校验和进行比较来验证校验和。

是否有某种终端命令可以复制这种校验和验证?

答案1

您可以结合使用优秀的“单一用途”Linux 工具来实现此目的。我假设您所说的“CRC”是指 CRC32。

为每个文件添加校验和

find . -maxdepth 1 -type f |while read -r FILE; do
    mv -i "$FILE" "${FILE%.*}"_[$(crc32 "$FILE")]."${FILE##*.}"
done

验证校验和是否正确

crc32 *

对于每个已标记的文件,crc32将在文件名后显示OK或(例如) 。BAD 93ed200a != 299f65cb

如果你没有 crc32 二进制文件

sudo apt install libarchive-zip-perl

答案2

Linux 命令行非常模块化,我能想到很多方法来实现这一点。除非你运行脚本,否则你可能无法优雅地将其作为单个命令解决方案来完成,但逻辑很简单 - 执行校验和,然后重命名文件,附加校验和。我注意到我使用了 sha512 校验和,但你可以执行大多数其他类型的校验和,包括可能更短的 md5。

我想出了如下的一条简单方法:

mv test.file test-\[`sha512sum test.file| cut -f1 -d" "`\].file

为了使其更加通用,在命令行上会很混乱,但使用脚本却相当容易 - 您可以使用脚本将文件拆分为扩展名之前和之后的部分。

验证输出将取决于重命名文件的确切格式,并且由于文件名的格式,这可能需要脚本来执行此操作。

通过编程来检查结果是可能的,但是会复杂得多,因为它将是一个非常复杂的一行程序。

下面是一个脚本,它将验证使用上面一行代码创建的文件

#! /bin/bash

if [ $1. == '.' ]
then
    echo Usage: $0 filename
fi

FILENAMECHECKSUM=`echo $1 | cut -f2 -d'[' | cut -f1 -d']'`
FILECONTENTCHECKSUM=`sha512sum $1 | cut -f1 -d" "`

if [ $FILENAMECHECKSUM == $FILECONTENTCHECKSUM ]
then
    echo "Checksum OK"
else
    echo "Checksum mismatch"
fi

 

相关内容