รับค่าแฮชเท่านั้นโดยใช้ md5sum (ไม่มีชื่อไฟล์)


176

ฉันใช้ md5sum เพื่อสร้างค่าแฮชสำหรับไฟล์ แต่ฉันต้องการเพียงรับค่าแฮชไม่ใช่ชื่อไฟล์

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

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

ฉันจะ 'ตัด' ชื่อไฟล์และยังคงค่าเพียง?


27
น่าแปลกใจมากที่นี่ไม่ใช่ตัวเลือกสำหรับ md5sum
Sridhar Sarnobat

11
ตกลงกัน! ทำไมนี่ไม่ใช่ตัวเลือก? GNU-Master สามารถฉายแสงได้หรือไม่?
rinogo

ทำไมคุณต้องตั้งค่าสถานะ "แฮชเท่านั้น" เมื่อคุณสามารถตัดผลลัพธ์ด้วย regex บางส่วน (ฉันแดกดัน)
Magnetic_dud

คำตอบ:


163

อีกวิธีหนึ่ง :)

md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`

7
หรือmd5=`md5sum < ${my_iso_file}` อย่างไรก็ตามสิ่งนี้ยังคงส่งออก "-" ในตอนท้าย แต่สำหรับการเปรียบเทียบนี่น่าจะเพียงพอแล้ว
Christophe De Troyer

ผิดจะให้ผลลัพธ์ต่อไปนี้บน Mac MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71และรหัสของคุณกลับMD5มา
เปอร์

คุณสามารถเริ่มต้น-ด้วยการเพิ่ม| awk '{print $1}'จุดสิ้นสุดของรหัสของคุณ => md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
alper

191

การกำหนดอาเรย์อย่างง่ายนั้นใช้งานได้ ... โปรดทราบว่าองค์ประกอบแรกของbashอาเรย์สามารถแก้ไขได้โดยเพียงแค่nameไม่มี[0]ดัชนีกล่าวคือ$md5มีเพียง 32 ตัวอักษรของ md5sum

md5=($(md5sum file))
echo $md5
# 53c8fdfcbb60cf8e1a1ee90601cc8fe2

น่ากลัว แค่คำถามเดียวฉันรู้ว่าคำถามถูกติดแท็กbashแต่คุณสามารถบอกฉันได้ไหมว่าอาเรย์นั้นเป็นคุณสมบัติทุบตีเท่านั้นหรือบางเชลล์มาตรฐาน?
jyz

บรรทัดแรกไม่สามารถทำงานได้ในส่วน do for for loop ... ในฐานะ Bash newb ฉันยังไม่รู้ว่าทำไม
Andy

@Andy: ถ้าคุณลองบรรทัดของรหัสนี้ (ใน terminal หรือในสคริปต์): echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done- มันควรจะส่งออก68b329da9893e34099c7d8ad5cb9c940
Peter.O

1
ทำไมecho ($(echo -n foo | md5sum))มันไม่ทำงาน? ข้อผิดพลาดออก bash: syntax error near unexpected token $(echo -n foo | md5sum)'
lkraav

2
@lkraav: คำสั่ง echo -n foo | md5sumส่งเอาต์พุต 2 คำของเชลล์ไปยังstdout : acbd18db4cc2f85cedef654fccc4a4d8และ-( -หมายถึงซอร์สที่เป็นstdin ) - คุณต้องบอกทุบตีในการจับภาพเหล่านั้นคำพูดเป็นสตริงโดยใช้คำสั่งเปลี่ยนตัว$( command ) : - (วงเล็บ)ผลิตbash array ที่มี 2 ​​องค์ประกอบ อย่างไรก็ตามคุณต้องกำหนดอาร์เรย์ที่สร้าง( … )ให้กับชื่อตัวแปร จึงใช้md5md5=($(echo -n foo | md5sum))เป็นชื่ออาร์เรย์: คุณยังไม่ได้กำหนดอาร์เรย์ให้กับชื่อตัวแปร
Peter.O

57

คุณสามารถใช้cutเพื่อแบ่งบรรทัดในช่องว่างและส่งกลับเฉพาะฟิลด์ดังกล่าวแรก:

md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)

18
หรือcut -c 1-32
Czarek Tomczak

7
@CzarekTomczak True แต่เพียงแค่ใช้วิธีการของคำตอบนี้คุณสามารถนำมันกลับมาใช้ใหม่ด้วยอัลกอริทึมการแปลงแป้นพิมพ์ที่แตกต่างกันเพียงแค่เปลี่ยนคำสั่งเอง md5sum-> sha256sumโดยไม่จำจำนวนอักขระที่คุณต้อง "ตัด"
David Tabernero M.

23

บน Mac OS X:

md5 -q file

ไม่ทำงานบน Mac OS X 10.7 ของฉัน แต่ขอบคุณสำหรับการโพสต์ไม่ว่าเวอร์ชั่นไหนจะใช้งานได้
Sridhar Sarnobat

นอกจากนี้gmd5sumจากการcoreutilsทำงานบน MacOS เหมือนmd5sumในคำตอบอื่น ๆ ที่กล่าวถึงที่นี่
Anton Tarasenko

14
md5="$(md5sum "${my_iso_file}")"
md5="${md5%% *}" # remove the first space and everything after it
echo "${md5}"

ดี หนึ่งหมายเหตุ - ในบรรทัดแรกที่คุณไม่จำเป็นต้องมีคำพูดรอบ$()(แม้ว่าพวกเขาจะไม่ทำอันตราย) ${}แต่แน่นอนต้องให้พวกเขาไปรอบ ๆ
Roman Cheplyaka

1
@ Roman: ใช่ฉันมักจะอ้างขยายตัวใด ๆ (เว้นแต่มีเหตุผลที่จะไม่) - เป็นเรื่องง่ายกว่าการติดตามกรณีที่ปลอดภัยที่จะข้ามคำพูด (แม้ว่าในกรณีนี้ฉันทิ้งชื่อไฟล์จริง ... ไว้ข้างหน้าเพื่อแก้ไข)
Gordon Davisson

5

ทางเดียว:

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

อีกวิธีหนึ่ง:

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

อีกวิธีหนึ่ง:

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

(อย่าลองใช้เครื่องหมายขีดหลังยกเว้นว่าคุณกล้าหาญและเก่งมากกับแบ็กสแลช)

ข้อได้เปรียบของการแก้ปัญหาเหล่านี้มากกว่าการแก้ปัญหาอื่น ๆ ที่พวกเขาเรียกmd5sumและเปลือกมากกว่าโปรแกรมอื่น ๆ เช่นหรือawk sedไม่ว่าเรื่องนั้นจะเป็นคำถามแยกต่างหากหรือไม่ คุณอาจกดยากที่จะสังเกตเห็นความแตกต่าง


4

อีกวิธีคือ:

md5sum filename |cut -f 1 -d " "

ตัดจะแบ่งบรรทัดแต่ละช่องว่างและส่งคืนเฉพาะฟิลด์แรกเท่านั้น



2

หากคุณต้องการพิมพ์และไม่จำเป็นต้องขึ้นบรรทัดใหม่คุณสามารถใช้:

printf $(md5sum filename)


0

md5sumวางแบ็กสแลชก่อนแฮชหากมีแบ็กสแลชในชื่อไฟล์ อักขระ 32 ตัวแรกหรืออะไรก็ตามก่อนที่จะเว้นวรรคแรกอาจไม่แฮชที่เหมาะสม มันจะไม่เกิดขึ้นเมื่อใช้เข้ามาตรฐาน (ชื่อไฟล์จะเป็นเพียง -) ดังนั้นคำตอบของ pixelbeatจะทำงาน แต่คนอื่น ๆ | tail -c 32จำนวนมากจะต้องมีการเพิ่มสิ่งที่ต้องการ


0

ฉันมีปัญหาเดียวกันในวันนี้ แต่พยายามรับแฮชไฟล์ md5 เมื่อใช้findคำสั่ง ฉันได้รับการโหวตมากที่สุดและห่อไว้ในฟังก์ชันที่เรียกว่าmd5รันในคำสั่ง find hash:filenameภารกิจสำหรับฉันก็คือกัญชาคำนวณสำหรับไฟล์ทั้งหมดในโฟลเดอร์และการส่งออกเป็น

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

ดังนั้นฉันจะได้รับชิ้นส่วนจากที่นี่และจากการค้นหา -exec ฟังก์ชั่นเปลือก?


0

เพื่อความสมบูรณ์ทางด้วย sed ใช้ regex และกลุ่มการจับกุม:

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

นิพจน์ regulare จะจับทุกอย่างในกลุ่มจนกว่าจะถึงที่ว่าง ในการรับกลุ่มการทำงานคุณต้องจับทุกอย่างไว้ (เพิ่มเติมเกี่ยวกับกลุ่ม sed และ caputer ที่นี่: https://stackoverflow.com/a/2778096/10926293 )
ในฐานะตัวคั่นใน sed ฉันใช้ colons เพราะมันไม่ถูกต้องในพา ธ ไฟล์และฉันไม่ต้องหลบ slashed ใน filepath



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.