2

В Bash, как мне проще всего проверить, что имя файла обычного файла имеет формат, показанный ниже?

<filename>.<md5sum of file content>

Например, предположим, что у меня был файл с первоначальным именем foo.txt и он содержал следующее:

Привет, мир

Сумма md5 этого файла:

f0ef7081e1539ac00ef5b761b4fb01b3

Поэтому я уже изменил имя файла на:

foo.txt.f0ef7081e1539ac00ef5b761b4fb01b3

Как в Bash лучше всего выполнить обработку строк, необходимую для проверки того, что часть имени файла после последней точки действительно является md5sum содержимого файла?

2 ответа2

1

Рассматривая bash-скрипт, в котором вы даете имя файла, которое хотите протестировать в качестве параметра:

./script.sh filename.f0ef7081e1539ac00ef5b761b4fb01b3

содержимое script.sh :

#!/bin/bash

#Get the md5 value from the filename (get the substring after the last '.' character)
expectedMD5=${1##*.}

#Calculate the md5sum value of the file
realMD5=$( md5sum $1 | awk '{ print $1 }' )

#Compare the 2 values
if [ $expectedMD5 = $realMD5 ]
then
        echo 'OK !'
else
        echo 'NOT OK'
fi
1

То, что написал @ Félicien - это суть ответа. Я просто хотел добавить, что у md5sum есть режим проверки :

md5sum [OPTION]... [FILE]...

-c, --check
       read MD5 sums from the FILEs and check them

Вы можете использовать его следующим образом. Предполагая, что f содержит имя файла, то

md5sum -c <( echo "${f##*.}" $f )

распечатывает

foo.txt.f0ef7081e1539ac00ef5b761b4fb01b3: OK

Это использует трюк Bash, известный как подстановка процесса. По сути, команда сначала выполняет

echo "${f##*.}" $f

который распечатывает

f0ef7081e1539ac00ef5b761b4fb01b3 foo.txt.f0ef7081e1539ac00ef5b761b4fb01b3

Но поскольку md5sum -c получает входные данные из файла, а не из стандартного ввода, выходные данные echo должны быть направлены во временное местоположение, чтобы md5sum мог их проглотить, что делается с помощью конструкции <() .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .