파일 이름없이 md5sum을 사용하여 해시 값만 가져옵니다.


176

md5sum을 사용하여 파일의 해시 값을 생성합니다. 그러나 파일 이름이 아닌 해시 값만 수신하면됩니다.

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

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

파일 이름을 '스트립'하고 값만 유지하려면 어떻게해야합니까?


27
놀랍게도 이것은 md5sum에 대한 옵션이 아닙니다.
Sridhar Sarnobat

11
동의했다! 이것이 옵션이 아닌가? GNU- 마스터가 약간의 빛을 비출 수 있습니까?
rinogo

정규식으로 결과를 다듬을 수 있는데 왜 "only hash"플래그가 필요한가? (나는 냉소적입니다)
Magnetic_dud

답변:


163

또 다른 방법 :)

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

7
또는 md5=`md5sum < ${my_iso_file}` 그러나 이것은 여전히 ​​끝에 "-"를 출력합니다. 그러나 비교를 위해 이것으로 충분합니다.
Christophe De Troyer 2016 년

Mac에서 다음과 같은 결과가 나옵니다. MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71 코드가 반환 MD5됩니다.
alper

당신의 실행을 얻을 수 있습니다 -추가하여 | awk '{print $1}'코드 =>의 끝을 md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
alper

191

간단한 배열 할당이 작동합니다 ... 배열의 첫 번째 요소 는 인덱스 없이 bash만 처리 할 수 ​​있습니다 . 즉, md5sum의 32 자만 포함합니다. name[0]$md5

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

대박. 하나의 질문 만, 질문에 태그가 붙어 있음을 알고 bash있지만 배열이 bash 전용 기능인지 또는 쉘 표준인지 알 수 있습니까?
jyz

첫 번째 줄은 for 루프의 do 섹션에서 작동하지 않습니다 ... Bash newb으로 아직 이유를 모릅니다
Andy

@Andy :이 코드 줄을 터미널에서 또는 스크립트로 시도하면 : 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 개 쉘 출력 단어 에 대한 표준 출력 : acbd18db4cc2f85cedef654fccc4a4d8-(은 -같은 소스를 나타내는 표준 입력 ). – Command Substitution :을 사용하여 bash 에 해당 단어 를 문자열로 캡처하도록 지시 해야합니다 . – 대괄호 는 2 개의 요소가 있는 bash 배열 을 생성합니다 . 그러나 해당 배열 구성 을 변수 이름에 할당해야합니다 . 따라서 배열 이름으로 md5 를 사용 하십시오 . 변수 이름에 배열을 할당하지 않았습니다$( command )()( … )md5=($(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 사실이지만이 답변의 방법을 사용하면 명령 자체를 변경하여 다른 해싱 알고리즘으로 재사용 할 수 있습니다. md5sum-> sha256sum잘라야 할 문자의 양을 기억하지 않고.
David Tabernero M.

23

Mac OS X의 경우 :

md5 -q file

Mac OS X 10.7에서 작동하지 않습니다. 그러나 모든 버전에 대해 게시 해 주셔서 감사합니다.
Sridhar Sarnobat

또한 gmd5sum에서이 coreutils같은 맥 OS에서 작동합니다 md5sum여기에 언급 된 다른 답변에서.
Anton Tarasenko

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

좋은. 한 가지 참고 사항-첫 번째 줄에는 따옴표가 필요 $()하지 않지만 (해가되지는 않지만) 반드시 따옴표 가 필요합니다 ${}.
로마 Cheplyaka

1
@Roman : 예, 습관적으로 확장을 인용하는 경향이 있습니다 (이유가 없다면). (이 경우 실제 파일 이름은 그대로두고 편집을
기다

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 자 또는 첫 공백 앞의 문자는 적절한 해시가 아닐 수 있습니다. 표준 입력 (파일 이름은 그냥-)을 사용할 때 발생하지 않으므로 픽셀 비트의 대답 은 효과가 있지만 많은 사람들이와 같은 것을 추가해야합니다 | tail -c 32.


0

글쎄, 오늘 같은 문제가 있었지만 find명령을 실행할 때 파일 md5 해시를 얻으려고했습니다 . 가장 투표가 많은 질문이 있고 md5find 명령을 실행하기 위해 호출 된 함수로 래핑했습니다 . 나를위한 임무는 폴더의 모든 파일에 대한 해시를 계산하고로 출력하는 것이 었습니다 hash:filename.

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

그래서 여기에서 그리고 조각에서 find -exec 셸 함수를 사용하여 조각을 얻었 습니까?


0

완전성을 위해 정규식 및 캡처 그룹을 사용하는 sed를 사용하는 방법 :

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

정규 표현식은 공간에 도달 할 때까지 그룹의 모든 것을 캡처합니다. 캡처 그룹을 작동 시키려면 sed에있는 모든 것을 캡처해야합니다. (sed 및 caputer 그룹에 대한 자세한 내용은 https://stackoverflow.com/a/2778096/10926293 )
sed의 구분 기호로 콜론을 사용합니다. 콜론은 파일 경로에서 유효하지 않으므로 슬래시를 벗어날 필요가 없습니다. 파일 경로.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.