Hanya dapatkan nilai hash menggunakan md5sum (tanpa nama file)

176

Saya menggunakan md5sum untuk menghasilkan nilai hash untuk file. Tetapi saya hanya perlu menerima nilai hash, bukan nama file.

md5=`md5sum ${my_iso_file}`
echo ${md5}

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

Bagaimana saya bisa 'menelanjangi' nama file dan hanya tetap nilainya?

John Doe
sumber
27
Sangat mengejutkan ini bukan opsi untuk md5sum.
Sridhar Sarnobat
11
Sepakat! Mengapa ini bukan opsi? Bisakah seorang GNU-Master menjelaskan?
rinogo
Mengapa Anda perlu memiliki bendera "hanya hash" ketika Anda dapat memotong hasilnya dengan beberapa regex? (Saya sarkastik)
Magnetic_dud

Jawaban:

163

Nah cara lain :)

md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`
jyz
sumber
7
Atau md5=`md5sum < ${my_iso_file}` Namun ini masih menampilkan "-" di akhir. Tetapi untuk perbandingan ini harus cukup.
Christophe De Troyer
Salah itu memberikan output berikut pada Mac MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71dan kode Anda kembali MD5.
alper
Anda dapat menjalankannya -dengan menambahkan | awk '{print $1}'akhir kode Anda => md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
alper
191

Tugas array sederhana berfungsi ... Perhatikan bahwa elemen pertama basharray dapat diatasi dengan hanya nametanpa [0]indeks, yaitu, $md5hanya berisi 32 karakter dari md5sum.

md5=($(md5sum file))
echo $md5
# 53c8fdfcbb60cf8e1a1ee90601cc8fe2
Peter.O
sumber
Luar biasa. Hanya satu pertanyaan, saya tahu pertanyaan itu ditandai bash, tetapi dapatkah Anda memberi tahu saya apakah array adalah fitur bash only atau standar shell?
jyz
baris pertama tidak berfungsi di dalam bagian do for a loop ... sebagai Bash newb Saya belum tahu mengapa
Andy
@Andy: Jika Anda mencoba baris kode ini (di terminal, atau dalam skrip): echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done- Seharusnya output68b329da9893e34099c7d8ad5cb9c940
Peter.O
1
Kenapa echo ($(echo -n foo | md5sum))tidak bekerja? Kesalahan bash: syntax error near unexpected token $(echo -n foo | md5sum)'
lkraav
2
@ lkraav: Perintah echo -n foo | md5sum menampilkan 2 kata shell ke stdout : acbd18db4cc2f85cedef654fccc4a4d8dan -(the -menunjukkan sumber sebagai stdin ). - Anda harus memberitahu pesta untuk menangkap mereka kata-kata ke dalam string, menggunakan Command Substitusi : $( command ). - (Kurung )menghasilkan array bash dengan 2 elemen. Namun, Anda harus menetapkan konstruk array itu ( … )ke nama variabel; karenanya, menggunakan md5 sebagai nama array: md5=($(echo -n foo | md5sum)). Anda belum menetapkan larik ke nama variabel
Peter.O
57

Anda dapat menggunakan cutuntuk membagi garis pada spasi dan hanya mengembalikan bidang seperti pertama:

md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)
Brian Campbell
sumber
18
Ataucut -c 1-32
Czarek Tomczak
7
@CzarekTomczak Benar, tetapi hanya dengan menggunakan metode jawaban ini, Anda dapat menggunakannya kembali dengan algoritma hashing yang berbeda hanya dengan mengubah perintah itu sendiri. md5sum-> sha256sumtanpa mengingat jumlah karakter yang Anda butuhkan untuk "memotong".
David Tabernero M.
23

Di Mac OS X:

md5 -q file
pengkhianat
sumber
tidak berfungsi pada Mac OS X 10.7 saya. Tapi terima kasih sudah memposting, untuk versi apa pun ini bekerja.
Sridhar Sarnobat
Juga gmd5sumdari coreutilsakan bekerja pada MacOS seperti md5sumpada jawaban lain yang disebutkan di sini.
Anton Tarasenko
14
md5="$(md5sum "${my_iso_file}")"
md5="${md5%% *}" # remove the first space and everything after it
echo "${md5}"
Gordon Davisson
sumber
Bagus. Satu catatan - pada baris pertama Anda tidak perlu tanda kutip di sekitar $()(meskipun mereka tidak membahayakan) tetapi tentu membutuhkannya ${}.
Roman Cheplyaka
1
@Roman: yeah, saya biasanya cenderung mengutip ekspansi apa pun (kecuali ada alasan untuk tidak) - lebih mudah daripada melacak kasus-kasus di mana aman untuk melewatkan kuotasi. (Meskipun dalam hal ini, saya meninggalkan mereka dari nama file yang sebenarnya ... siap sedia untuk diedit.)
Gordon Davisson
5

Satu arah:

set -- $(md5sum $file)
md5=$1

Cara lain:

md5=$(md5sum $file | while read sum file; do echo $sum; done)

Cara lain:

md5=$(set -- $(md5sum $file); echo $1)

(Jangan coba-coba dengan back-ticks kecuali Anda sangat berani dan sangat baik dengan backslash.)

Keuntungan dari solusi ini dibandingkan solusi lain adalah bahwa mereka hanya menjalankan md5sumdan shell, daripada program lain seperti awkatau sed. Apakah itu benar-benar penting maka merupakan pertanyaan terpisah; Anda mungkin akan kesulitan menemukan perbedaannya.

Jonathan Leffler
sumber
4

Cara lain adalah dengan melakukan:

md5sum filename |cut -f 1 -d " "

Cut akan membagi garis ke setiap ruang dan hanya mengembalikan bidang pertama.

azerttyu
sumber
2
md5=$(md5sum < $file | tr -d ' -')
pixelbeat
sumber
2

Jika Anda perlu mencetaknya dan tidak memerlukan baris baru, Anda dapat menggunakan:

printf $(md5sum filename)
Alex
sumber
1
md5=`md5sum ${my_iso_file} | cut -b-32`
letronje
sumber
0

md5summenempatkan backslash sebelum hash jika ada backslash dalam nama file. 32 karakter pertama atau apapun sebelum spasi pertama mungkin bukan hash yang tepat. Itu tidak akan terjadi ketika menggunakan input standar (nama file akan adil -), jadi jawaban pixelbeat akan berfungsi, tetapi banyak orang lain akan membutuhkan menambahkan sesuatu seperti | tail -c 32.

Wojciech
sumber
0

Yah, saya punya masalah yang sama hari ini, tetapi mencoba untuk mendapatkan file md5 hash ketika menjalankan findperintah. Saya mendapat pertanyaan paling banyak dan membungkusnya dalam fungsi yang dipanggil md5untuk menjalankan perintah find. Misi bagi saya adalah menghitung hash untuk semua file dalam folder dan menampilkannya sebagai hash:filename.

md5() { md5sum $1 | awk '{ printf "%s",$1 }'; }
export -f md5
find -type f -exec bash -c 'md5 "$0"' {} \; -exec echo -n ':' \; -print

Jadi, saya dapat beberapa bagian dari sini dan juga dari -exec fungsi shell?

Fabio Montefuscolo
sumber
0

Demi kelengkapan cara dengan sed menggunakan regex dan grup tangkap:

md5=$(md5sum "${my_iso_file}" | sed -r 's:\\*([^ ]*).*:\1:')

Ekspresi yang diatur adalah menangkap semua yang ada di grup hingga ruang tercapai. Agar grup tangkap berfungsi, Anda perlu menangkap semua yang ada di sed. (Lebih lanjut tentang kelompok sed dan kaputer di sini: https://stackoverflow.com/a/2778096/10926293 )
Sebagai pembatas dalam sed saya menggunakan titik dua karena mereka tidak valid dalam jalur file dan saya tidak perlu melarikan diri dari garis miring di filepath.

FleMo
sumber
-3

Cara lain:

md5=$(md5sum ${my_iso_file} | sed '/ .*//' )
codaddict
sumber
-3
md5=$(md5sum < index.html | head -c -4)
Dijeda sampai pemberitahuan lebih lanjut.
sumber