Uzyskaj wartość skrótu tylko przy użyciu sumy md5 (bez nazwy pliku)


176

Używam md5sum do wygenerowania wartości skrótu dla pliku. Ale muszę otrzymać tylko wartość skrótu, a nie nazwę pliku.

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

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

Jak mogę „usunąć” nazwę pliku i zachować tylko wartość?


27
Bardzo zaskakujące, że nie jest to opcja dla md5sum.
Sridhar Sarnobat

11
Zgoda! Dlaczego nie ma takiej opcji? Czy GNU-Master może rzucić trochę światła?
rinogo

Dlaczego potrzebujesz flagi „only hash”, skoro możesz przyciąć wynik za pomocą jakiegoś wyrażenia regularnego? (Jestem sarkastyczny)
Magnetic_dud

Odpowiedzi:


163

Cóż w inny sposób :)

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

7
Lub md5=`md5sum < ${my_iso_file}` Jednak to nadal wyświetla "-" na końcu. Ale do porównań to powinno wystarczyć.
Christophe De Troyer

Źle to daje następujące dane wyjściowe na Macu MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71i twój kod wraca MD5.
Alper

Możesz dostać run of -, dodając | awk '{print $1}'koniec swojego kodu => md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
alper

191

Proste przypisanie tablicy działa ... Zauważ, że pierwszy element bashtablicy może być adresowany tylko przez namebez [0]indeksu, tzn. $md5Zawiera tylko 32 znaki sumy md5.

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

Niesamowite. Tylko jedno pytanie, wiem, że pytanie jest oznaczone bash, ale czy możesz mi powiedzieć, czy tablica jest tylko funkcją bash, czy jakimś standardem powłoki?
jyz

pierwsza linia nie działa w sekcji do pętli for ... jako Bash newb Nie wiem jeszcze dlaczego
Andy.

@Andy: Jeśli wypróbujesz ten wiersz kodu (w terminalu lub w skrypcie): echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done- Powinien 68b329da9893e34099c7d8ad5cb9c940
wypisać

1
Dlaczego echo ($(echo -n foo | md5sum))nie działa? Błędy usunięte bash: syntax error near unexpected token $(echo -n foo | md5sum)'
lkraav

2
@lkraav: Polecenie echo -n foo | md5sum wyprowadza 2 słowa powłoki na stdout : acbd18db4cc2f85cedef654fccc4a4d8i -( -wskazuje źródło jako stdin ). - Musisz powiedzieć bash , aby uchwycić te słowa na sznurku, używając polecenia Zmiana : $( command ). - (Nawiasy )tworzą tablicę bash z 2 elementami. Jednak musisz przypisać tę konstrukcję tablicową ( … )do nazwy zmiennej; W związku z tym, przy użyciu MD5 jak nazwa tablicy: md5=($(echo -n foo | md5sum)). Nie przypisałeś tablicy do nazwy zmiennej
Peter. O

57

Możesz użyć, cutaby podzielić linię na spacje i zwrócić tylko pierwsze takie pole:

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

18
Lubcut -c 1-32
Czarek Tomczak

7
@CzarekTomczak To prawda, ale używając metody tej odpowiedzi, możesz użyć jej ponownie z różnymi algorytmami haszowania, po prostu zmieniając samo polecenie. md5sum-> sha256sumbez pamiętania, jaką ilość znaków trzeba „wyciąć”.
David Tabernero M.,

23

W systemie Mac OS X:

md5 -q file

nie działa na moim Mac OS X 10.7. Ale dzięki za wysłanie wiadomości, niezależnie od wersji, na której to działa.
Sridhar Sarnobat

Również gmd5sumz coreutilsdziałałby na MacOS, jak md5sumw innych wymienionych tutaj odpowiedziach.
Anton Tarasenko

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

Miły. Jedna uwaga - w pierwszym wierszu nie potrzebujesz cudzysłowów $()(chociaż nie szkodzą), ale z pewnością potrzebujesz ich wokół ${}.
Roman Cheplyaka,

1
@Roman: tak, zwykle cytuję każde rozszerzenie (chyba że jest powód, by tego nie robić) - jest to łatwiejsze niż śledzenie przypadków, w których można bezpiecznie pominąć cytaty. (Chociaż w tym przypadku zostawiłem je bez rzeczywistej nazwy pliku ... czekaj na edycję.)
Gordon Davisson,

5

Jednokierunkowa:

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

Inny sposób:

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

Inny sposób:

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

(Nie próbuj tego z back-tickami, chyba że jesteś bardzo odważny i bardzo dobry w backslashach.)

Zaletą tych rozwiązań w stosunku do innych rozwiązań jest to, że wywołują one tylko md5sumi powłokę, a nie inne programy, takie jak awklub sed. Czy to rzeczywiście ma znaczenie, to oddzielna kwestia; prawdopodobnie trudno byłoby zauważyć różnicę.


4

Innym sposobem jest:

md5sum filename |cut -f 1 -d " "

Wytnij podzieli linię na każdą spację i zwróci tylko pierwsze pole.



2

Jeśli chcesz go wydrukować i nie potrzebujesz nowego wiersza, możesz użyć:

printf $(md5sum filename)


0

md5sumumieszcza ukośnik odwrotny przed hashem, jeśli w nazwie pliku występuje ukośnik odwrotny. Pierwsze 32 znaki lub cokolwiek przed pierwszą spacją może nie być prawidłowym hashem. Nie stanie się to przy standardowym wejściu (nazwa pliku to po prostu -), więc odpowiedź pixelbeat będzie działać, ale wiele innych będzie wymagało dodania czegoś takiego | tail -c 32.


0

Cóż, miałem dzisiaj ten sam problem, ale próbowałem uzyskać hash pliku md5 podczas uruchamiania findpolecenia. Otrzymałem najczęściej głosowane pytanie i opakowałem je w funkcję wywoływaną md5do uruchomienia w poleceniu find. Misją dla mnie było obliczenie skrótu dla wszystkich plików w folderze i wyprowadzenie go jako hash:filename.

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

Więc mam kilka kawałków stąd, a także z funkcji find -exec?


0

Ze względu na kompletność sposób z sedem przy użyciu wyrażenia regularnego i grupy przechwytywania:

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

Wyrażenie regularare obejmuje wszystko w grupie, aż do osiągnięcia odpowiedniej przestrzeni. Aby uzyskać pracę w grupie, musisz przechwycić wszystko w sed. (Więcej o grupach sed i caputer tutaj: https://stackoverflow.com/a/2778096/10926293 )
Jako separator w sed używam dwukropków, ponieważ nie są one prawidłowe w ścieżkach plików i nie muszę uciekać przed ukośnikiem w ścieżka pliku.



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.