Chỉ nhận giá trị băm bằng md5sum (không có tên tệp)


176

Tôi sử dụng md5sum để tạo giá trị băm cho một tệp. Nhưng tôi chỉ cần nhận giá trị băm, không phải tên tệp.

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

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

Làm cách nào tôi có thể 'tước' tên tệp và chỉ giữ nguyên giá trị?


27
Rất đáng ngạc nhiên đây không phải là một lựa chọn cho md5sum.
Sridhar Sarnobat

11
Đã đồng ý! Tại sao đây không phải là một lựa chọn? GNU-Master có thể làm sáng tỏ?
rinogo

Tại sao bạn cần phải có cờ "chỉ băm" khi bạn có thể cắt kết quả bằng một số biểu thức chính quy? (Tôi mỉa mai)
Từ tính

Câu trả lời:


163

Một cách khác :)

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

7
Hoặc md5=`md5sum < ${my_iso_file}` Tuy nhiên, điều này vẫn xuất ra "-" ở cuối. Nhưng để so sánh điều này là đủ.
Barshe De Troyer

Sai nó cung cấp đầu ra sau trên Mac MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71và mã của bạn trả về MD5.
alper

Bạn có thể nhận chạy của -bằng cách thêm | awk '{print $1}'vào cuối của mã của bạn => md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
Alper

191

Một phép gán mảng đơn giản hoạt động ... Lưu ý rằng phần tử đầu tiên của một bashmảng có thể được xử lý chỉ bằng cách namekhông có [0]chỉ mục, tức là $md5chỉ chứa 32 ký tự của md5sum.

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

Tuyệt vời. Chỉ cần một câu hỏi, tôi biết câu hỏi được gắn thẻ bash, nhưng bạn có thể cho tôi biết nếu mảng là một tính năng chỉ bash hoặc một số tiêu chuẩn shell?
jyz

dòng đầu tiên không hoạt động bên trong phần do của vòng lặp for ... như một Bash newb Tôi chưa biết tại sao
Andy

@Andy: Nếu bạn thử dòng mã này (trong thiết bị đầu cuối hoặc trong tập lệnh): echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done- Nó sẽ xuất ra68b329da9893e34099c7d8ad5cb9c940
Peter.O

1
Làm thế nào echo ($(echo -n foo | md5sum))mà không làm việc? Lỗi ra bash: syntax error near unexpected token $(echo -n foo | md5sum)'
lkraav

2
@lkraav: Lệnh echo -n foo | md5sum xuất 2 từ shell sang stdout : acbd18db4cc2f85cedef654fccc4a4d8-( -chỉ ra nguồn là stdin ). - Bạn phải nói bash để bắt những từ đó thành một chuỗi, sử dụng Lệnh thay thế : $( command ). - (Dấu ngoặc )tạo ra một mảng bash có 2 phần tử. Tuy nhiên, bạn phải gán cấu trúc mảng đó ( … )cho một tên biến; do đó, sử dụng md5 làm tên mảng : md5=($(echo -n foo | md5sum)). Bạn chưa gán mảng cho một tên biến
Peter.O

57

Bạn có thể sử dụng cutđể phân chia dòng trên dấu cách và chỉ trả về trường đầu tiên như vậy:

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

18
Hoặccut -c 1-32
Czarek Tomczak

7
@CzarekTomczak Đúng, nhưng chỉ bằng cách sử dụng phương thức của câu trả lời này, bạn có thể sử dụng lại nó với các thuật toán băm khác nhau chỉ bằng cách thay đổi chính lệnh. md5sum-> sha256summà không nhớ số lượng ký tự bạn cần "cắt".
David Tabernero M.

23

Trên Mac OS X:

md5 -q file

không hoạt động trên Mac OS X 10.7 của tôi. Nhưng cảm ơn bạn đã đăng bài, cho bất kỳ phiên bản này hoạt động trên.
Sridhar Sarnobat

Cũng gmd5sumtừ coreutilssẽ hoạt động trên MacOS như md5sumtrong các câu trả lời khác được đề cập ở đây.
Anton Tarasenko

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

Đẹp. Một lưu ý - trên dòng đầu tiên bạn không cần trích dẫn xung quanh $()(mặc dù chúng không gây hại) nhưng chắc chắn cần chúng ở xung quanh ${}.
Roman Cheplyaka

1
@Roman: yeah, tôi có xu hướng trích dẫn bất kỳ sự mở rộng nào (trừ khi có lý do để không) - dễ dàng hơn là theo dõi các trường hợp an toàn để bỏ qua các trích dẫn. (Mặc dù trong trường hợp này, tôi đã để chúng ra khỏi tên tệp thực tế ... chờ chỉnh sửa.)
Gordon Davisson

5

Một chiều:

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

Cách khác:

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

Cách khác:

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

(Đừng thử điều đó với đánh dấu ngược trừ khi bạn rất dũng cảm và rất giỏi với dấu gạch chéo ngược.)

Ưu điểm của các giải pháp này so với các giải pháp khác là chúng chỉ gọi md5sumvà trình bao, chứ không phải các chương trình khác như awkhoặc sed. Cho dù điều đó thực sự quan trọng thì đó là một câu hỏi riêng biệt; bạn có thể khó có thể nhận ra sự khác biệt.


4

Một cách khác là làm:

md5sum filename |cut -f 1 -d " "

Cắt sẽ phân chia dòng cho mỗi không gian và chỉ trả lại trường đầu tiên.



2

Nếu bạn cần in nó và không cần một dòng mới, bạn có thể sử dụng:

printf $(md5sum filename)


0

md5sumđặt dấu gạch chéo ngược trước hàm băm nếu có dấu gạch chéo ngược trong tên tệp. 32 ký tự đầu tiên hoặc bất cứ điều gì trước không gian đầu tiên có thể không phải là một hàm băm thích hợp. Điều đó sẽ không xảy ra khi sử dụng đầu vào tiêu chuẩn (tên tệp sẽ chỉ là -), vì vậy câu trả lời của pixelbeat sẽ hoạt động, nhưng nhiều người khác sẽ yêu cầu thêm một cái gì đó như | tail -c 32.


0

Chà, hôm nay tôi cũng gặp vấn đề tương tự, nhưng cố gắng lấy tệp băm md5 khi chạy findlệnh. Tôi nhận được câu hỏi được bình chọn nhiều nhất và gói nó trong một hàm được gọi md5để chạy trong lệnh find. Nhiệm vụ đối với tôi là tính toán hàm băm cho tất cả các tệp trong một thư mục và xuất ra dưới dạng hash:filename.

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

Vì vậy, tôi đã nhận được một số phần từ đây và cũng từ tìm -exec một hàm shell?


0

Để hoàn thiện một cách với sed sử dụng regex và nhóm chụp:

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

Biểu thức điều chỉnh đang nắm bắt mọi thứ trong một nhóm cho đến khi đạt được khoảng trắng. Để bắt nhóm làm việc, bạn cần chụp mọi thứ trong sed. (Thông tin thêm về sed và nhóm caputer đây: https://stackoverflow.com/a/2778096/10926293 )
Như delimiter trong sed tôi sử dụng dấu hai chấm, vì họ là không hợp lệ trong đường dẫn tập tin và tôi không cần phải thoát khỏi giảm trong đường dẫn tập tin.



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.