Periksa apakah Nama file adalah Formulir <filename>. <Md5sum konten file>

2

Di Bash, bagaimana saya bisa paling mudah memeriksa bahwa nama file file biasa adalah format yang ditunjukkan di bawah ini?

<filename>.<md5sum of file content>

Misalnya, anggap saya punya file yang nama aslinya foo.txt dan punya konten ini:

Halo Dunia

MD5sum file ini adalah:

f0ef7081e1539ac00ef5b761b4fb01b3

Oleh karena itu, saya telah mengubah nama file menjadi:

foo.txt.f0ef7081e1539ac00ef5b761b4fb01b3

Bagaimana, dalam Bash, mungkin saya bisa melakukan pemrosesan string yang diperlukan untuk memverifikasi bahwa porsi nama file setelah titik terakhir memang merupakan md5sum dari konten file?

Dave
sumber

Jawaban:

1

Mempertimbangkan skrip bash tempat Anda memberikan nama file yang ingin Anda uji sebagai parameter:

./script.sh filename.f0ef7081e1539ac00ef5b761b4fb01b3

isi dari 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
Félicien
sumber
1

Apa yang ditulis @Félicien adalah inti dari jawabannya. Saya hanya ingin menambahkan yang md5summemiliki mode verifikasi :

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

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

Anda bisa menggunakannya sebagai berikut. Dengan asumsi yang fberisi nama file, maka

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

mencetak

foo.txt.f0ef7081e1539ac00ef5b761b4fb01b3: OK

Ini menggunakan trik Bash yang dikenal sebagai proses substitusi . Pada dasarnya, perintah pertama dijalankan

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

yang dicetak

f0ef7081e1539ac00ef5b761b4fb01b3 foo.txt.f0ef7081e1539ac00ef5b761b4fb01b3

Tetapi karena md5sum -cmengambilnya input dari file, bukan dari input standar, output dari echokebutuhan perlu diarahkan ke lokasi sementara untuk md5summenelannya, yang dilakukan dengan <()konstruk.

Edward
sumber